// This file is distributed under the University of Illinois Open Source License.
// See LICENSE.TXT for details.
// RUN: c_compiler -c -o %t1.o -I "common" "common/testsuite.c"
// RUN: cxx_compiler cxx_rtti -c %s -I "common" -o %t2.o
// RUN: c_compiler -c %s -I "common" -o %t3.o
// RUN: linker -o %t2%exeext  %t1.o %t2.o %t3.o
// RUN: runtool %t2%exeext | checker "TEST PASSED"
#include "testsuite.h"
#ifdef __cplusplus

struct  A0  {
  int fa;
};
//SIG(-1 A0) C1{ Fi}



static void Test_A0()
{
  {
    init_simple_test("A0");
    A0 lv;
    check2(sizeof(lv), 4, "sizeof(A0)");
    check2(__alignof__(lv), 4, "__alignof__(A0)");
    check_field_offset(lv, fa, 0, "A0.fa");
  }
}
static Arrange_To_Call_Me vA0(Test_A0, "A0", 4);

#else // __cplusplus

extern VTBL_ENTRY _ZTI2A0[];
VTBL_ENTRY *P__ZTI2A0 = _ZTI2A0; 
Class_Descriptor cd_A0 = {  "A0", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  4, // object size
  NSPAIRA(_ZTI2A0),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  A1  {
  int fa;
  virtual void  foo(); // _ZN2A13fooEv
  ~A1(); // tgen
  A1(); // tgen
};
//SIG(-1 A1) C1{ v1 Fi}


void  A1 ::foo(){vfunc_called(this, "_ZN2A13fooEv");}
A1 ::~A1(){ note_dtor("A1", this);} // tgen
A1 ::A1(){ note_ctor("A1", this);} // tgen

static void Test_A1()
{
  extern Class_Descriptor cd_A1;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_A1, buf);
    A1 *dp, &lv = *(dp=new (buf) A1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(A1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(A1)");
    check_field_offset(lv, fa, ABISELECT(8,4), "A1.fa");
    test_class_info(&lv, &cd_A1);
    dp->~A1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vA1(Test_A1, "A1", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN2A1C1Ev();
extern void _ZN2A1D1Ev();
Name_Map name_map_A1[] = {
  NSPAIR(_ZN2A1C1Ev),
  NSPAIR(_ZN2A1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI2A1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_A1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2A1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
Class_Descriptor cd_A1 = {  "A1", // class name
  0,0,//no base classes
  &(vtc_A1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI2A1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV2A1),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  B0  {
  int fb;
};
//SIG(-1 B0) C1{ Fi}



static void Test_B0()
{
  {
    init_simple_test("B0");
    B0 lv;
    check2(sizeof(lv), 4, "sizeof(B0)");
    check2(__alignof__(lv), 4, "__alignof__(B0)");
    check_field_offset(lv, fb, 0, "B0.fb");
  }
}
static Arrange_To_Call_Me vB0(Test_B0, "B0", 4);

#else // __cplusplus

extern VTBL_ENTRY _ZTI2B0[];
VTBL_ENTRY *P__ZTI2B0 = _ZTI2B0; 
Class_Descriptor cd_B0 = {  "B0", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  4, // object size
  NSPAIRA(_ZTI2B0),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  B1  {
  int fb;
  virtual void  foo(); // _ZN2B13fooEv
  ~B1(); // tgen
  B1(); // tgen
};
//SIG(-1 B1) C1{ v1 Fi}


void  B1 ::foo(){vfunc_called(this, "_ZN2B13fooEv");}
B1 ::~B1(){ note_dtor("B1", this);} // tgen
B1 ::B1(){ note_ctor("B1", this);} // tgen

static void Test_B1()
{
  extern Class_Descriptor cd_B1;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_B1, buf);
    B1 *dp, &lv = *(dp=new (buf) B1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(B1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(B1)");
    check_field_offset(lv, fb, ABISELECT(8,4), "B1.fb");
    test_class_info(&lv, &cd_B1);
    dp->~B1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vB1(Test_B1, "B1", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN2B1C1Ev();
extern void _ZN2B1D1Ev();
Name_Map name_map_B1[] = {
  NSPAIR(_ZN2B1C1Ev),
  NSPAIR(_ZN2B1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI2B1[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_B1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2B1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
Class_Descriptor cd_B1 = {  "B1", // class name
  0,0,//no base classes
  &(vtc_B1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI2B1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV2B1),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  D0  {
  int fd;
};
//SIG(-1 D0) C1{ Fi}



static void Test_D0()
{
  {
    init_simple_test("D0");
    D0 lv;
    check2(sizeof(lv), 4, "sizeof(D0)");
    check2(__alignof__(lv), 4, "__alignof__(D0)");
    check_field_offset(lv, fd, 0, "D0.fd");
  }
}
static Arrange_To_Call_Me vD0(Test_D0, "D0", 4);

#else // __cplusplus

extern VTBL_ENTRY _ZTI2D0[];
VTBL_ENTRY *P__ZTI2D0 = _ZTI2D0; 
Class_Descriptor cd_D0 = {  "D0", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  4, // object size
  NSPAIRA(_ZTI2D0),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  D1  {
  int fd;
  virtual void  foo(); // _ZN2D13fooEv
  ~D1(); // tgen
  D1(); // tgen
};
//SIG(1 D1) C1{ v1 Fi}


void  D1 ::foo(){vfunc_called(this, "_ZN2D13fooEv");}
D1 ::~D1(){ note_dtor("D1", this);} // tgen
D1 ::D1(){ note_ctor("D1", this);} // tgen

static void Test_D1()
{
  extern Class_Descriptor cd_D1;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_D1, buf);
    D1 *dp, &lv = *(dp=new (buf) D1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(D1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(D1)");
    check_field_offset(lv, fd, ABISELECT(8,4), "D1.fd");
    test_class_info(&lv, &cd_D1);
    dp->~D1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vD1(Test_D1, "D1", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN2D1C1Ev();
extern void _ZN2D1D1Ev();
Name_Map name_map_D1[] = {
  NSPAIR(_ZN2D1C1Ev),
  NSPAIR(_ZN2D1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI2D1[];
extern void _ZN2D13fooEv();
static  VTBL_ENTRY vtc_D1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2D1[0]),
  (VTBL_ENTRY)&_ZN2D13fooEv,
};
extern VTBL_ENTRY _ZTI2D1[];
extern  VTBL_ENTRY _ZTV2D1[];
Class_Descriptor cd_D1 = {  "D1", // class name
  0,0,//no base classes
  &(vtc_D1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI2D1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV2D1),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  F0  {
  int ff;
};
//SIG(-1 F0) C1{ Fi}



static void Test_F0()
{
  {
    init_simple_test("F0");
    F0 lv;
    check2(sizeof(lv), 4, "sizeof(F0)");
    check2(__alignof__(lv), 4, "__alignof__(F0)");
    check_field_offset(lv, ff, 0, "F0.ff");
  }
}
static Arrange_To_Call_Me vF0(Test_F0, "F0", 4);

#else // __cplusplus

extern VTBL_ENTRY _ZTI2F0[];
VTBL_ENTRY *P__ZTI2F0 = _ZTI2F0; 
Class_Descriptor cd_F0 = {  "F0", // class name
  0,0,//no base classes
  0, // no vftv
  0, //no vtt
  4, // object size
  NSPAIRA(_ZTI2F0),ABISELECT(16,8), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  F1  {
  int ff;
  virtual void  foo(); // _ZN2F13fooEv
  ~F1(); // tgen
  F1(); // tgen
};
//SIG(-1 F1) C1{ v1 Fi}


void  F1 ::foo(){vfunc_called(this, "_ZN2F13fooEv");}
F1 ::~F1(){ note_dtor("F1", this);} // tgen
F1 ::F1(){ note_ctor("F1", this);} // tgen

static void Test_F1()
{
  extern Class_Descriptor cd_F1;
  void *lvp;
  {
    ABISELECT(double,int) buf[3];
    init_test(&cd_F1, buf);
    F1 *dp, &lv = *(dp=new (buf) F1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(16,8), "sizeof(F1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(F1)");
    check_field_offset(lv, ff, ABISELECT(8,4), "F1.ff");
    test_class_info(&lv, &cd_F1);
    dp->~F1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vF1(Test_F1, "F1", ABISELECT(16,8));

#else // __cplusplus

extern void _ZN2F1C1Ev();
extern void _ZN2F1D1Ev();
Name_Map name_map_F1[] = {
  NSPAIR(_ZN2F1C1Ev),
  NSPAIR(_ZN2F1D1Ev),
  {0,0}
};
extern VTBL_ENTRY _ZTI2F1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_F1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2F1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
Class_Descriptor cd_F1 = {  "F1", // class name
  0,0,//no base classes
  &(vtc_F1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(16,8), // object size
  NSPAIRA(_ZTI2F1),ABISELECT(16,8), //typeinfo_var
  NSPAIRA(_ZTV2F1),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C0  : A0 , B0 {
  int fc;
};
//SIG(-1 C0) C1{ BC2{ Fi} BC3{ Fi} Fi}



static void Test_C0()
{
  extern Class_Descriptor cd_C0;
  void *lvp;
  {
    int buf[4];
    init_test(&cd_C0, buf);
    C0 &lv = *(new (buf) C0());
    lvp = (void*)&lv;
    check2(sizeof(lv), 12, "sizeof(C0)");
    check2(__alignof__(lv), 4, "__alignof__(C0)");
    check_base_class_offset(lv, (A0*), 0, "C0");
    check_base_class_offset(lv, (B0*), 4, "C0");
    check_field_offset(lv, fc, 8, "C0.fc");
    test_class_info(&lv, &cd_C0);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC0(Test_C0, "C0", 12);

#else // __cplusplus

extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    4, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C0[];
Class_Descriptor cd_C0 = {  "C0", // class name
  bases_C0, 2,
  0, // no vftv
  0, //no vtt
  12, // object size
  NSPAIRA(_ZTI2C0),ABISELECT(56,32), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C1  : A1 , B0 {
  int fc;
  ~C1(); // tgen
  C1(); // tgen
};
//SIG(-1 C1) C1{ BC2{ v1 Fi} BC3{ Fi} Fi}


C1 ::~C1(){ note_dtor("C1", this);} // tgen
C1 ::C1(){ note_ctor("C1", this);} // tgen

static void Test_C1()
{
  extern Class_Descriptor cd_C1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C1, buf);
    C1 *dp, &lv = *(dp=new (buf) C1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C1)");
    check_base_class_offset(lv, (A1*), 0, "C1");
    check_base_class_offset(lv, (B0*), ABISELECT(12,8), "C1");
    check_field_offset(lv, fc, ABISELECT(16,12), "C1.fc");
    test_class_info(&lv, &cd_C1);
    dp->~C1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC1(Test_C1, "C1", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN2C1C1Ev();
extern void _ZN2C1D1Ev();
Name_Map name_map_C1[] = {
  NSPAIR(_ZN2C1C1Ev),
  NSPAIR(_ZN2C1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_C1[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2C1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
Class_Descriptor cd_C1 = {  "C1", // class name
  bases_C1, 2,
  &(vtc_C1[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI2C1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C1),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C2  : virtual A0 , B0 {
  int fc;
  ~C2(); // tgen
  C2(); // tgen
};
//SIG(-1 C2) C1{ VBC2{ Fi} BC3{ Fi} Fi}


C2 ::~C2(){ note_dtor("C2", this);} // tgen
C2 ::C2(){ note_ctor("C2", this);} // tgen

static void Test_C2()
{
  extern Class_Descriptor cd_C2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C2, buf);
    C2 *dp, &lv = *(dp=new (buf) C2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C2)");
    check_base_class_offset(lv, (A0*), ABISELECT(16,12), "C2");
    check_base_class_offset(lv, (B0*), ABISELECT(8,4), "C2");
    check_field_offset(lv, fc, ABISELECT(12,8), "C2.fc");
    test_class_info(&lv, &cd_C2);
    dp->~C2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC2(Test_C2, "C2", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN2C2C1Ev();
extern void _ZN2C2D1Ev();
Name_Map name_map_C2[] = {
  NSPAIR(_ZN2C2C1Ev),
  NSPAIR(_ZN2C2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C2[];
static  VTBL_ENTRY vtc_C2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
extern VTBL_ENTRY _ZTV2C2[];
static  VTT_ENTRY vtt_C2[] = {
  {&(_ZTV2C2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
Class_Descriptor cd_C2 = {  "C2", // class name
  bases_C2, 2,
  &(vtc_C2[0]), // expected_vtbl_contents
  &(vtt_C2[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI2C2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C2),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT2C2),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C3  : virtual A1 , B0 {
  int fc;
  ~C3(); // tgen
  C3(); // tgen
};
//SIG(-1 C3) C1{ VBC2{ v1 Fi} BC3{ Fi} Fi}


C3 ::~C3(){ note_dtor("C3", this);} // tgen
C3 ::C3(){ note_ctor("C3", this);} // tgen

static void Test_C3()
{
  extern Class_Descriptor cd_C3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C3, buf);
    C3 *dp, &lv = *(dp=new (buf) C3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C3)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,12), "C3");
    check_base_class_offset(lv, (B0*), ABISELECT(8,4), "C3");
    check_field_offset(lv, fc, ABISELECT(12,8), "C3.fc");
    test_class_info(&lv, &cd_C3);
    dp->~C3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC3(Test_C3, "C3", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN2C3C1Ev();
extern void _ZN2C3D1Ev();
Name_Map name_map_C3[] = {
  NSPAIR(_ZN2C3C1Ev),
  NSPAIR(_ZN2C3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_C3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV2C3[];
static  VTT_ENTRY vtt_C3[] = {
  {&(_ZTV2C3[3]),  3,7},
  {&(_ZTV2C3[6]),  6,7},
};
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
Class_Descriptor cd_C3 = {  "C3", // class name
  bases_C3, 2,
  &(vtc_C3[0]), // expected_vtbl_contents
  &(vtt_C3[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI2C3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C3),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT2C3),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C4  : A0 , B1 {
  int fc;
  ~C4(); // tgen
  C4(); // tgen
};
//SIG(-1 C4) C1{ BC2{ Fi} BC3{ v1 Fi} Fi}


C4 ::~C4(){ note_dtor("C4", this);} // tgen
C4 ::C4(){ note_ctor("C4", this);} // tgen

static void Test_C4()
{
  extern Class_Descriptor cd_C4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C4, buf);
    C4 *dp, &lv = *(dp=new (buf) C4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C4)");
    check_base_class_offset(lv, (A0*), ABISELECT(12,8), "C4");
    check_base_class_offset(lv, (B1*), 0, "C4");
    check_field_offset(lv, fc, ABISELECT(16,12), "C4.fc");
    test_class_info(&lv, &cd_C4);
    dp->~C4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC4(Test_C4, "C4", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN2C4C1Ev();
extern void _ZN2C4D1Ev();
Name_Map name_map_C4[] = {
  NSPAIR(_ZN2C4C1Ev),
  NSPAIR(_ZN2C4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2C4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
Class_Descriptor cd_C4 = {  "C4", // class name
  bases_C4, 2,
  &(vtc_C4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI2C4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C5  : A1 , B1 {
  int fc;
  ~C5(); // tgen
  C5(); // tgen
};
//SIG(-1 C5) C1{ BC2{ v1 Fi} BC3{ v2 Fi} Fi}


C5 ::~C5(){ note_dtor("C5", this);} // tgen
C5 ::C5(){ note_ctor("C5", this);} // tgen

static void Test_C5()
{
  extern Class_Descriptor cd_C5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C5, buf);
    C5 *dp, &lv = *(dp=new (buf) C5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C5)");
    check_base_class_offset(lv, (A1*), 0, "C5");
    check_base_class_offset(lv, (B1*), ABISELECT(16,8), "C5");
    check_field_offset(lv, fc, ABISELECT(28,16), "C5.fc");
    test_class_info(&lv, &cd_C5);
    dp->~C5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC5(Test_C5, "C5", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN2C5C1Ev();
extern void _ZN2C5D1Ev();
Name_Map name_map_C5[] = {
  NSPAIR(_ZN2C5C1Ev),
  NSPAIR(_ZN2C5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C5[] = {
  0,
  (VTBL_ENTRY)&(_ZTI2C5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI2C5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
Class_Descriptor cd_C5 = {  "C5", // class name
  bases_C5, 2,
  &(vtc_C5[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI2C5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C5),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C6  : virtual A0 , B1 {
  int fc;
  ~C6(); // tgen
  C6(); // tgen
};
//SIG(-1 C6) C1{ VBC2{ Fi} BC3{ v1 Fi} Fi}


C6 ::~C6(){ note_dtor("C6", this);} // tgen
C6 ::C6(){ note_ctor("C6", this);} // tgen

static void Test_C6()
{
  extern Class_Descriptor cd_C6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C6, buf);
    C6 *dp, &lv = *(dp=new (buf) C6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C6)");
    check_base_class_offset(lv, (A0*), ABISELECT(16,12), "C6");
    check_base_class_offset(lv, (B1*), 0, "C6");
    check_field_offset(lv, fc, ABISELECT(12,8), "C6.fc");
    test_class_info(&lv, &cd_C6);
    dp->~C6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC6(Test_C6, "C6", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN2C6C1Ev();
extern void _ZN2C6D1Ev();
Name_Map name_map_C6[] = {
  NSPAIR(_ZN2C6C1Ev),
  NSPAIR(_ZN2C6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV2C6[];
static  VTT_ENTRY vtt_C6[] = {
  {&(_ZTV2C6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
Class_Descriptor cd_C6 = {  "C6", // class name
  bases_C6, 2,
  &(vtc_C6[0]), // expected_vtbl_contents
  &(vtt_C6[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI2C6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT2C6),1, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C7  : virtual A1 , B1 {
  int fc;
  ~C7(); // tgen
  C7(); // tgen
};
//SIG(-1 C7) C1{ VBC2{ v1 Fi} BC3{ v2 Fi} Fi}


C7 ::~C7(){ note_dtor("C7", this);} // tgen
C7 ::C7(){ note_ctor("C7", this);} // tgen

static void Test_C7()
{
  extern Class_Descriptor cd_C7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C7, buf);
    C7 *dp, &lv = *(dp=new (buf) C7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C7)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,12), "C7");
    check_base_class_offset(lv, (B1*), 0, "C7");
    check_field_offset(lv, fc, ABISELECT(12,8), "C7.fc");
    test_class_info(&lv, &cd_C7);
    dp->~C7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC7(Test_C7, "C7", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN2C7C1Ev();
extern void _ZN2C7D1Ev();
Name_Map name_map_C7[] = {
  NSPAIR(_ZN2C7C1Ev),
  NSPAIR(_ZN2C7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI2C7[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_C7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV2C7[];
static  VTT_ENTRY vtt_C7[] = {
  {&(_ZTV2C7[3]),  3,8},
  {&(_ZTV2C7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
Class_Descriptor cd_C7 = {  "C7", // class name
  bases_C7, 2,
  &(vtc_C7[0]), // expected_vtbl_contents
  &(vtt_C7[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI2C7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C7),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT2C7),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C8  : A0 , virtual B0 {
  int fc;
  ~C8(); // tgen
  C8(); // tgen
};
//SIG(-1 C8) C1{ BC2{ Fi} VBC3{ Fi} Fi}


C8 ::~C8(){ note_dtor("C8", this);} // tgen
C8 ::C8(){ note_ctor("C8", this);} // tgen

static void Test_C8()
{
  extern Class_Descriptor cd_C8;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C8, buf);
    C8 *dp, &lv = *(dp=new (buf) C8());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C8)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C8)");
    check_base_class_offset(lv, (A0*), ABISELECT(8,4), "C8");
    check_base_class_offset(lv, (B0*), ABISELECT(16,12), "C8");
    check_field_offset(lv, fc, ABISELECT(12,8), "C8.fc");
    test_class_info(&lv, &cd_C8);
    dp->~C8();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC8(Test_C8, "C8", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN2C8C1Ev();
extern void _ZN2C8D1Ev();
Name_Map name_map_C8[] = {
  NSPAIR(_ZN2C8C1Ev),
  NSPAIR(_ZN2C8D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C8[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI2C8[];
static  VTBL_ENTRY vtc_C8[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
extern VTBL_ENTRY _ZTV2C8[];
static  VTT_ENTRY vtt_C8[] = {
  {&(_ZTV2C8[3]),  3,3},
};
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
Class_Descriptor cd_C8 = {  "C8", // class name
  bases_C8, 2,
  &(vtc_C8[0]), // expected_vtbl_contents
  &(vtt_C8[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI2C8),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C8),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT2C8),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C9  : A1 , virtual B0 {
  int fc;
  ~C9(); // tgen
  C9(); // tgen
};
//SIG(-1 C9) C1{ BC2{ v1 Fi} VBC3{ Fi} Fi}


C9 ::~C9(){ note_dtor("C9", this);} // tgen
C9 ::C9(){ note_ctor("C9", this);} // tgen

static void Test_C9()
{
  extern Class_Descriptor cd_C9;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C9, buf);
    C9 *dp, &lv = *(dp=new (buf) C9());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C9)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C9)");
    check_base_class_offset(lv, (A1*), 0, "C9");
    check_base_class_offset(lv, (B0*), ABISELECT(16,12), "C9");
    check_field_offset(lv, fc, ABISELECT(12,8), "C9.fc");
    test_class_info(&lv, &cd_C9);
    dp->~C9();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC9(Test_C9, "C9", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN2C9C1Ev();
extern void _ZN2C9D1Ev();
Name_Map name_map_C9[] = {
  NSPAIR(_ZN2C9C1Ev),
  NSPAIR(_ZN2C9D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C9[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI2C9[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_C9[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV2C9[];
static  VTT_ENTRY vtt_C9[] = {
  {&(_ZTV2C9[3]),  3,4},
};
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
Class_Descriptor cd_C9 = {  "C9", // class name
  bases_C9, 2,
  &(vtc_C9[0]), // expected_vtbl_contents
  &(vtt_C9[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI2C9),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV2C9),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT2C9),1, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C10  : virtual A0 , virtual B0 {
  int fc;
  ~C10(); // tgen
  C10(); // tgen
};
//SIG(-1 C10) C1{ VBC2{ Fi} VBC3{ Fi} Fi}


C10 ::~C10(){ note_dtor("C10", this);} // tgen
C10 ::C10(){ note_ctor("C10", this);} // tgen

static void Test_C10()
{
  extern Class_Descriptor cd_C10;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C10, buf);
    C10 *dp, &lv = *(dp=new (buf) C10());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C10)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C10)");
    check_base_class_offset(lv, (A0*), ABISELECT(12,8), "C10");
    check_base_class_offset(lv, (B0*), ABISELECT(16,12), "C10");
    check_field_offset(lv, fc, ABISELECT(8,4), "C10.fc");
    test_class_info(&lv, &cd_C10);
    dp->~C10();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC10(Test_C10, "C10", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C10C1Ev();
extern void _ZN3C10D1Ev();
Name_Map name_map_C10[] = {
  NSPAIR(_ZN3C10C1Ev),
  NSPAIR(_ZN3C10D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C10[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C10[];
static  VTBL_ENTRY vtc_C10[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
extern VTBL_ENTRY _ZTV3C10[];
static  VTT_ENTRY vtt_C10[] = {
  {&(_ZTV3C10[4]),  4,4},
};
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
Class_Descriptor cd_C10 = {  "C10", // class name
  bases_C10, 2,
  &(vtc_C10[0]), // expected_vtbl_contents
  &(vtt_C10[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C10),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C10),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C10),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C11  : virtual A1 , virtual B0 {
  int fc;
  ~C11(); // tgen
  C11(); // tgen
};
//SIG(-1 C11) C1{ VBC2{ v1 Fi} VBC3{ Fi} Fi}


C11 ::~C11(){ note_dtor("C11", this);} // tgen
C11 ::C11(){ note_ctor("C11", this);} // tgen

static void Test_C11()
{
  extern Class_Descriptor cd_C11;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C11, buf);
    C11 *dp, &lv = *(dp=new (buf) C11());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C11)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C11)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,8), "C11");
    check_base_class_offset(lv, (B0*), ABISELECT(28,16), "C11");
    check_field_offset(lv, fc, ABISELECT(8,4), "C11.fc");
    test_class_info(&lv, &cd_C11);
    dp->~C11();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC11(Test_C11, "C11", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C11C1Ev();
extern void _ZN3C11D1Ev();
Name_Map name_map_C11[] = {
  NSPAIR(_ZN3C11C1Ev),
  NSPAIR(_ZN3C11D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C11[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C11[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_C11[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV3C11[];
static  VTT_ENTRY vtt_C11[] = {
  {&(_ZTV3C11[4]),  4,8},
  {&(_ZTV3C11[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
Class_Descriptor cd_C11 = {  "C11", // class name
  bases_C11, 2,
  &(vtc_C11[0]), // expected_vtbl_contents
  &(vtt_C11[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C11),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C11),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C11),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C12  : A0 , virtual B1 {
  int fc;
  ~C12(); // tgen
  C12(); // tgen
};
//SIG(-1 C12) C1{ BC2{ Fi} VBC3{ v1 Fi} Fi}


C12 ::~C12(){ note_dtor("C12", this);} // tgen
C12 ::C12(){ note_ctor("C12", this);} // tgen

static void Test_C12()
{
  extern Class_Descriptor cd_C12;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C12, buf);
    C12 *dp, &lv = *(dp=new (buf) C12());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C12)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C12)");
    check_base_class_offset(lv, (A0*), ABISELECT(8,4), "C12");
    check_base_class_offset(lv, (B1*), ABISELECT(16,12), "C12");
    check_field_offset(lv, fc, ABISELECT(12,8), "C12.fc");
    test_class_info(&lv, &cd_C12);
    dp->~C12();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC12(Test_C12, "C12", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C12C1Ev();
extern void _ZN3C12D1Ev();
Name_Map name_map_C12[] = {
  NSPAIR(_ZN3C12C1Ev),
  NSPAIR(_ZN3C12D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C12[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C12[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C12[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV3C12[];
static  VTT_ENTRY vtt_C12[] = {
  {&(_ZTV3C12[3]),  3,7},
  {&(_ZTV3C12[6]),  6,7},
};
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
Class_Descriptor cd_C12 = {  "C12", // class name
  bases_C12, 2,
  &(vtc_C12[0]), // expected_vtbl_contents
  &(vtt_C12[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C12),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C12),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C12),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C13  : A1 , virtual B1 {
  int fc;
  ~C13(); // tgen
  C13(); // tgen
};
//SIG(-1 C13) C1{ BC2{ v1 Fi} VBC3{ v2 Fi} Fi}


C13 ::~C13(){ note_dtor("C13", this);} // tgen
C13 ::C13(){ note_ctor("C13", this);} // tgen

static void Test_C13()
{
  extern Class_Descriptor cd_C13;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C13, buf);
    C13 *dp, &lv = *(dp=new (buf) C13());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C13)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C13)");
    check_base_class_offset(lv, (A1*), 0, "C13");
    check_base_class_offset(lv, (B1*), ABISELECT(16,12), "C13");
    check_field_offset(lv, fc, ABISELECT(12,8), "C13.fc");
    test_class_info(&lv, &cd_C13);
    dp->~C13();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC13(Test_C13, "C13", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C13C1Ev();
extern void _ZN3C13D1Ev();
Name_Map name_map_C13[] = {
  NSPAIR(_ZN3C13C1Ev),
  NSPAIR(_ZN3C13D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C13[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C13[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C13[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV3C13[];
static  VTT_ENTRY vtt_C13[] = {
  {&(_ZTV3C13[3]),  3,8},
  {&(_ZTV3C13[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
Class_Descriptor cd_C13 = {  "C13", // class name
  bases_C13, 2,
  &(vtc_C13[0]), // expected_vtbl_contents
  &(vtt_C13[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C13),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C13),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C13),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C14  : virtual A0 , virtual B1 {
  int fc;
  ~C14(); // tgen
  C14(); // tgen
};
//SIG(-1 C14) C1{ VBC2{ Fi} VBC3{ v1 Fi} Fi}


C14 ::~C14(){ note_dtor("C14", this);} // tgen
C14 ::C14(){ note_ctor("C14", this);} // tgen

static void Test_C14()
{
  extern Class_Descriptor cd_C14;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C14, buf);
    C14 *dp, &lv = *(dp=new (buf) C14());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C14)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C14)");
    check_base_class_offset(lv, (A0*), ABISELECT(12,8), "C14");
    check_base_class_offset(lv, (B1*), ABISELECT(16,12), "C14");
    check_field_offset(lv, fc, ABISELECT(8,4), "C14.fc");
    test_class_info(&lv, &cd_C14);
    dp->~C14();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC14(Test_C14, "C14", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C14C1Ev();
extern void _ZN3C14D1Ev();
Name_Map name_map_C14[] = {
  NSPAIR(_ZN3C14C1Ev),
  NSPAIR(_ZN3C14D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C14[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C14[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C14[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV3C14[];
static  VTT_ENTRY vtt_C14[] = {
  {&(_ZTV3C14[4]),  4,8},
  {&(_ZTV3C14[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
Class_Descriptor cd_C14 = {  "C14", // class name
  bases_C14, 2,
  &(vtc_C14[0]), // expected_vtbl_contents
  &(vtt_C14[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C14),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C14),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C14),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C15  : virtual A1 , virtual B1 {
  int fc;
  ~C15(); // tgen
  C15(); // tgen
};
//SIG(-1 C15) C1{ VBC2{ v1 Fi} VBC3{ v2 Fi} Fi}


C15 ::~C15(){ note_dtor("C15", this);} // tgen
C15 ::C15(){ note_ctor("C15", this);} // tgen

static void Test_C15()
{
  extern Class_Descriptor cd_C15;
  void *lvp;
  {
    ABISELECT(double,int) buf[7];
    init_test(&cd_C15, buf);
    C15 *dp, &lv = *(dp=new (buf) C15());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(C15)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C15)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,8), "C15");
    check_base_class_offset(lv, (B1*), ABISELECT(32,16), "C15");
    check_field_offset(lv, fc, ABISELECT(8,4), "C15.fc");
    test_class_info(&lv, &cd_C15);
    dp->~C15();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC15(Test_C15, "C15", ABISELECT(48,24));

#else // __cplusplus

extern void _ZN3C15C1Ev();
extern void _ZN3C15D1Ev();
Name_Map name_map_C15[] = {
  NSPAIR(_ZN3C15C1Ev),
  NSPAIR(_ZN3C15D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C15[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C15[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_C15[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV3C15[];
static  VTT_ENTRY vtt_C15[] = {
  {&(_ZTV3C15[4]),  4,12},
  {&(_ZTV3C15[7]),  7,12},
  {&(_ZTV3C15[11]),  11,12},
};
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
Class_Descriptor cd_C15 = {  "C15", // class name
  bases_C15, 2,
  &(vtc_C15[0]), // expected_vtbl_contents
  &(vtt_C15[0]), // expected_vtt_contents
  ABISELECT(48,24), // object size
  NSPAIRA(_ZTI3C15),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C15),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C15),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C16  : A0 , B0 {
  int fc;
  virtual void  foo(); // _ZN3C163fooEv
  ~C16(); // tgen
  C16(); // tgen
};
//SIG(-1 C16) C1{ BC2{ Fi} BC3{ Fi} v1 Fi}


void  C16 ::foo(){vfunc_called(this, "_ZN3C163fooEv");}
C16 ::~C16(){ note_dtor("C16", this);} // tgen
C16 ::C16(){ note_ctor("C16", this);} // tgen

static void Test_C16()
{
  extern Class_Descriptor cd_C16;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C16, buf);
    C16 *dp, &lv = *(dp=new (buf) C16());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C16)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C16)");
    check_base_class_offset(lv, (A0*), ABISELECT(8,4), "C16");
    check_base_class_offset(lv, (B0*), ABISELECT(12,8), "C16");
    check_field_offset(lv, fc, ABISELECT(16,12), "C16.fc");
    test_class_info(&lv, &cd_C16);
    dp->~C16();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC16(Test_C16, "C16", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C16C1Ev();
extern void _ZN3C16D1Ev();
Name_Map name_map_C16[] = {
  NSPAIR(_ZN3C16C1Ev),
  NSPAIR(_ZN3C16D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C16[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C16[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_C16[] = {
  0,
  (VTBL_ENTRY)&(_ZTI3C16[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
Class_Descriptor cd_C16 = {  "C16", // class name
  bases_C16, 2,
  &(vtc_C16[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C16),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C16),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C17  : A1 , B0 {
  int fc;
  virtual void  foo(); // _ZN3C173fooEv
  ~C17(); // tgen
  C17(); // tgen
};
//SIG(-1 C17) C1{ BC2{ v1 Fi} BC3{ Fi} v1 Fi}


void  C17 ::foo(){vfunc_called(this, "_ZN3C173fooEv");}
C17 ::~C17(){ note_dtor("C17", this);} // tgen
C17 ::C17(){ note_ctor("C17", this);} // tgen

static void Test_C17()
{
  extern Class_Descriptor cd_C17;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C17, buf);
    C17 *dp, &lv = *(dp=new (buf) C17());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C17)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C17)");
    check_base_class_offset(lv, (A1*), 0, "C17");
    check_base_class_offset(lv, (B0*), ABISELECT(12,8), "C17");
    check_field_offset(lv, fc, ABISELECT(16,12), "C17.fc");
    test_class_info(&lv, &cd_C17);
    dp->~C17();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC17(Test_C17, "C17", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C17C1Ev();
extern void _ZN3C17D1Ev();
Name_Map name_map_C17[] = {
  NSPAIR(_ZN3C17C1Ev),
  NSPAIR(_ZN3C17D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C17[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C17[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_C17[] = {
  0,
  (VTBL_ENTRY)&(_ZTI3C17[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
Class_Descriptor cd_C17 = {  "C17", // class name
  bases_C17, 2,
  &(vtc_C17[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C17),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C17),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C18  : virtual A0 , B0 {
  int fc;
  virtual void  foo(); // _ZN3C183fooEv
  ~C18(); // tgen
  C18(); // tgen
};
//SIG(-1 C18) C1{ VBC2{ Fi} BC3{ Fi} v1 Fi}


void  C18 ::foo(){vfunc_called(this, "_ZN3C183fooEv");}
C18 ::~C18(){ note_dtor("C18", this);} // tgen
C18 ::C18(){ note_ctor("C18", this);} // tgen

static void Test_C18()
{
  extern Class_Descriptor cd_C18;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C18, buf);
    C18 *dp, &lv = *(dp=new (buf) C18());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C18)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C18)");
    check_base_class_offset(lv, (A0*), ABISELECT(16,12), "C18");
    check_base_class_offset(lv, (B0*), ABISELECT(8,4), "C18");
    check_field_offset(lv, fc, ABISELECT(12,8), "C18.fc");
    test_class_info(&lv, &cd_C18);
    dp->~C18();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC18(Test_C18, "C18", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C18C1Ev();
extern void _ZN3C18D1Ev();
Name_Map name_map_C18[] = {
  NSPAIR(_ZN3C18C1Ev),
  NSPAIR(_ZN3C18D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C18[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C18[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_C18[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV3C18[];
static  VTT_ENTRY vtt_C18[] = {
  {&(_ZTV3C18[3]),  3,4},
};
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
Class_Descriptor cd_C18 = {  "C18", // class name
  bases_C18, 2,
  &(vtc_C18[0]), // expected_vtbl_contents
  &(vtt_C18[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C18),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C18),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C18),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C19  : virtual A1 , B0 {
  int fc;
  virtual void  foo(); // _ZN3C193fooEv
  ~C19(); // tgen
  C19(); // tgen
};
//SIG(-1 C19) C1{ VBC2{ v1 Fi} BC3{ Fi} v1 Fi}


void  C19 ::foo(){vfunc_called(this, "_ZN3C193fooEv");}
C19 ::~C19(){ note_dtor("C19", this);} // tgen
C19 ::C19(){ note_ctor("C19", this);} // tgen

static void Test_C19()
{
  extern Class_Descriptor cd_C19;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C19, buf);
    C19 *dp, &lv = *(dp=new (buf) C19());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C19)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C19)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,12), "C19");
    check_base_class_offset(lv, (B0*), ABISELECT(8,4), "C19");
    check_field_offset(lv, fc, ABISELECT(12,8), "C19.fc");
    test_class_info(&lv, &cd_C19);
    dp->~C19();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC19(Test_C19, "C19", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C19C1Ev();
extern void _ZN3C19D1Ev();
Name_Map name_map_C19[] = {
  NSPAIR(_ZN3C19C1Ev),
  NSPAIR(_ZN3C19D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C19[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C19[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C19[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV3C19[];
static  VTT_ENTRY vtt_C19[] = {
  {&(_ZTV3C19[3]),  3,8},
  {&(_ZTV3C19[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
static VTBL_ENTRY alt_thunk_names1[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C19 = {  "C19", // class name
  bases_C19, 2,
  &(vtc_C19[0]), // expected_vtbl_contents
  &(vtt_C19[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C19),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C19),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C19),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names1,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C20  : A0 , B1 {
  int fc;
  virtual void  foo(); // _ZN3C203fooEv
  ~C20(); // tgen
  C20(); // tgen
};
//SIG(-1 C20) C1{ BC2{ Fi} BC3{ v1 Fi} v1 Fi}


void  C20 ::foo(){vfunc_called(this, "_ZN3C203fooEv");}
C20 ::~C20(){ note_dtor("C20", this);} // tgen
C20 ::C20(){ note_ctor("C20", this);} // tgen

static void Test_C20()
{
  extern Class_Descriptor cd_C20;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C20, buf);
    C20 *dp, &lv = *(dp=new (buf) C20());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C20)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C20)");
    check_base_class_offset(lv, (A0*), ABISELECT(12,8), "C20");
    check_base_class_offset(lv, (B1*), 0, "C20");
    check_field_offset(lv, fc, ABISELECT(16,12), "C20.fc");
    test_class_info(&lv, &cd_C20);
    dp->~C20();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC20(Test_C20, "C20", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C20C1Ev();
extern void _ZN3C20D1Ev();
Name_Map name_map_C20[] = {
  NSPAIR(_ZN3C20C1Ev),
  NSPAIR(_ZN3C20D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C20[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C20[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_C20[] = {
  0,
  (VTBL_ENTRY)&(_ZTI3C20[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
Class_Descriptor cd_C20 = {  "C20", // class name
  bases_C20, 2,
  &(vtc_C20[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C20),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C20),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C21  : A1 , B1 {
  int fc;
  virtual void  foo(); // _ZN3C213fooEv
  ~C21(); // tgen
  C21(); // tgen
};
//SIG(-1 C21) C1{ BC2{ v1 Fi} BC3{ v1 Fi} v1 Fi}


void  C21 ::foo(){vfunc_called(this, "_ZN3C213fooEv");}
C21 ::~C21(){ note_dtor("C21", this);} // tgen
C21 ::C21(){ note_ctor("C21", this);} // tgen

static void Test_C21()
{
  extern Class_Descriptor cd_C21;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C21, buf);
    C21 *dp, &lv = *(dp=new (buf) C21());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C21)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C21)");
    check_base_class_offset(lv, (A1*), 0, "C21");
    check_base_class_offset(lv, (B1*), ABISELECT(16,8), "C21");
    check_field_offset(lv, fc, ABISELECT(28,16), "C21.fc");
    test_class_info(&lv, &cd_C21);
    dp->~C21();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC21(Test_C21, "C21", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C21C1Ev();
extern void _ZN3C21D1Ev();
Name_Map name_map_C21[] = {
  NSPAIR(_ZN3C21C1Ev),
  NSPAIR(_ZN3C21D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C21[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C21[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_C21[] = {
  0,
  (VTBL_ENTRY)&(_ZTI3C21[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C21[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
Class_Descriptor cd_C21 = {  "C21", // class name
  bases_C21, 2,
  &(vtc_C21[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C21),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C21),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C22  : virtual A0 , B1 {
  int fc;
  virtual void  foo(); // _ZN3C223fooEv
  ~C22(); // tgen
  C22(); // tgen
};
//SIG(-1 C22) C1{ VBC2{ Fi} BC3{ v1 Fi} v1 Fi}


void  C22 ::foo(){vfunc_called(this, "_ZN3C223fooEv");}
C22 ::~C22(){ note_dtor("C22", this);} // tgen
C22 ::C22(){ note_ctor("C22", this);} // tgen

static void Test_C22()
{
  extern Class_Descriptor cd_C22;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C22, buf);
    C22 *dp, &lv = *(dp=new (buf) C22());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C22)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C22)");
    check_base_class_offset(lv, (A0*), ABISELECT(16,12), "C22");
    check_base_class_offset(lv, (B1*), 0, "C22");
    check_field_offset(lv, fc, ABISELECT(12,8), "C22.fc");
    test_class_info(&lv, &cd_C22);
    dp->~C22();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC22(Test_C22, "C22", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C22C1Ev();
extern void _ZN3C22D1Ev();
Name_Map name_map_C22[] = {
  NSPAIR(_ZN3C22C1Ev),
  NSPAIR(_ZN3C22D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C22[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C22[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_C22[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV3C22[];
static  VTT_ENTRY vtt_C22[] = {
  {&(_ZTV3C22[3]),  3,4},
};
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
Class_Descriptor cd_C22 = {  "C22", // class name
  bases_C22, 2,
  &(vtc_C22[0]), // expected_vtbl_contents
  &(vtt_C22[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C22),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C22),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C22),1, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C23  : virtual A1 , B1 {
  int fc;
  virtual void  foo(); // _ZN3C233fooEv
  ~C23(); // tgen
  C23(); // tgen
};
//SIG(-1 C23) C1{ VBC2{ v1 Fi} BC3{ v1 Fi} v1 Fi}


void  C23 ::foo(){vfunc_called(this, "_ZN3C233fooEv");}
C23 ::~C23(){ note_dtor("C23", this);} // tgen
C23 ::C23(){ note_ctor("C23", this);} // tgen

static void Test_C23()
{
  extern Class_Descriptor cd_C23;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C23, buf);
    C23 *dp, &lv = *(dp=new (buf) C23());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C23)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C23)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,12), "C23");
    check_base_class_offset(lv, (B1*), 0, "C23");
    check_field_offset(lv, fc, ABISELECT(12,8), "C23.fc");
    test_class_info(&lv, &cd_C23);
    dp->~C23();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC23(Test_C23, "C23", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C23C1Ev();
extern void _ZN3C23D1Ev();
Name_Map name_map_C23[] = {
  NSPAIR(_ZN3C23C1Ev),
  NSPAIR(_ZN3C23D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C23[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI3C23[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C23[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV3C23[];
static  VTT_ENTRY vtt_C23[] = {
  {&(_ZTV3C23[3]),  3,8},
  {&(_ZTV3C23[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
static VTBL_ENTRY alt_thunk_names2[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C23 = {  "C23", // class name
  bases_C23, 2,
  &(vtc_C23[0]), // expected_vtbl_contents
  &(vtt_C23[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C23),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C23),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C23),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names2,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C24  : A0 , virtual B0 {
  int fc;
  virtual void  foo(); // _ZN3C243fooEv
  ~C24(); // tgen
  C24(); // tgen
};
//SIG(-1 C24) C1{ BC2{ Fi} VBC3{ Fi} v1 Fi}


void  C24 ::foo(){vfunc_called(this, "_ZN3C243fooEv");}
C24 ::~C24(){ note_dtor("C24", this);} // tgen
C24 ::C24(){ note_ctor("C24", this);} // tgen

static void Test_C24()
{
  extern Class_Descriptor cd_C24;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C24, buf);
    C24 *dp, &lv = *(dp=new (buf) C24());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C24)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C24)");
    check_base_class_offset(lv, (A0*), ABISELECT(8,4), "C24");
    check_base_class_offset(lv, (B0*), ABISELECT(16,12), "C24");
    check_field_offset(lv, fc, ABISELECT(12,8), "C24.fc");
    test_class_info(&lv, &cd_C24);
    dp->~C24();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC24(Test_C24, "C24", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C24C1Ev();
extern void _ZN3C24D1Ev();
Name_Map name_map_C24[] = {
  NSPAIR(_ZN3C24C1Ev),
  NSPAIR(_ZN3C24D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C24[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C24[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_C24[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV3C24[];
static  VTT_ENTRY vtt_C24[] = {
  {&(_ZTV3C24[3]),  3,4},
};
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
Class_Descriptor cd_C24 = {  "C24", // class name
  bases_C24, 2,
  &(vtc_C24[0]), // expected_vtbl_contents
  &(vtt_C24[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C24),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C24),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C24),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C25  : A1 , virtual B0 {
  int fc;
  virtual void  foo(); // _ZN3C253fooEv
  ~C25(); // tgen
  C25(); // tgen
};
//SIG(-1 C25) C1{ BC2{ v1 Fi} VBC3{ Fi} v1 Fi}


void  C25 ::foo(){vfunc_called(this, "_ZN3C253fooEv");}
C25 ::~C25(){ note_dtor("C25", this);} // tgen
C25 ::C25(){ note_ctor("C25", this);} // tgen

static void Test_C25()
{
  extern Class_Descriptor cd_C25;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C25, buf);
    C25 *dp, &lv = *(dp=new (buf) C25());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C25)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C25)");
    check_base_class_offset(lv, (A1*), 0, "C25");
    check_base_class_offset(lv, (B0*), ABISELECT(16,12), "C25");
    check_field_offset(lv, fc, ABISELECT(12,8), "C25.fc");
    test_class_info(&lv, &cd_C25);
    dp->~C25();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC25(Test_C25, "C25", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C25C1Ev();
extern void _ZN3C25D1Ev();
Name_Map name_map_C25[] = {
  NSPAIR(_ZN3C25C1Ev),
  NSPAIR(_ZN3C25D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C25[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C25[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_C25[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV3C25[];
static  VTT_ENTRY vtt_C25[] = {
  {&(_ZTV3C25[3]),  3,4},
};
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
Class_Descriptor cd_C25 = {  "C25", // class name
  bases_C25, 2,
  &(vtc_C25[0]), // expected_vtbl_contents
  &(vtt_C25[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C25),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C25),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C25),1, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C26  : virtual A0 , virtual B0 {
  int fc;
  virtual void  foo(); // _ZN3C263fooEv
  ~C26(); // tgen
  C26(); // tgen
};
//SIG(-1 C26) C1{ VBC2{ Fi} VBC3{ Fi} v1 Fi}


void  C26 ::foo(){vfunc_called(this, "_ZN3C263fooEv");}
C26 ::~C26(){ note_dtor("C26", this);} // tgen
C26 ::C26(){ note_ctor("C26", this);} // tgen

static void Test_C26()
{
  extern Class_Descriptor cd_C26;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(4,5)];
    init_test(&cd_C26, buf);
    C26 *dp, &lv = *(dp=new (buf) C26());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(24,16), "sizeof(C26)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C26)");
    check_base_class_offset(lv, (A0*), ABISELECT(12,8), "C26");
    check_base_class_offset(lv, (B0*), ABISELECT(16,12), "C26");
    check_field_offset(lv, fc, ABISELECT(8,4), "C26.fc");
    test_class_info(&lv, &cd_C26);
    dp->~C26();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC26(Test_C26, "C26", ABISELECT(24,16));

#else // __cplusplus

extern void _ZN3C26C1Ev();
extern void _ZN3C26D1Ev();
Name_Map name_map_C26[] = {
  NSPAIR(_ZN3C26C1Ev),
  NSPAIR(_ZN3C26D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C26[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C26[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_C26[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV3C26[];
static  VTT_ENTRY vtt_C26[] = {
  {&(_ZTV3C26[4]),  4,5},
};
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
Class_Descriptor cd_C26 = {  "C26", // class name
  bases_C26, 2,
  &(vtc_C26[0]), // expected_vtbl_contents
  &(vtt_C26[0]), // expected_vtt_contents
  ABISELECT(24,16), // object size
  NSPAIRA(_ZTI3C26),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C26),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C26),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C27  : virtual A1 , virtual B0 {
  int fc;
  virtual void  foo(); // _ZN3C273fooEv
  ~C27(); // tgen
  C27(); // tgen
};
//SIG(-1 C27) C1{ VBC2{ v1 Fi} VBC3{ Fi} v1 Fi}


void  C27 ::foo(){vfunc_called(this, "_ZN3C273fooEv");}
C27 ::~C27(){ note_dtor("C27", this);} // tgen
C27 ::C27(){ note_ctor("C27", this);} // tgen

static void Test_C27()
{
  extern Class_Descriptor cd_C27;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C27, buf);
    C27 *dp, &lv = *(dp=new (buf) C27());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C27)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C27)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,8), "C27");
    check_base_class_offset(lv, (B0*), ABISELECT(28,16), "C27");
    check_field_offset(lv, fc, ABISELECT(8,4), "C27.fc");
    test_class_info(&lv, &cd_C27);
    dp->~C27();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC27(Test_C27, "C27", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C27C1Ev();
extern void _ZN3C27D1Ev();
Name_Map name_map_C27[] = {
  NSPAIR(_ZN3C27C1Ev),
  NSPAIR(_ZN3C27D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
static Base_Class bases_C27[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C27[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C27[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV3C27[];
static  VTT_ENTRY vtt_C27[] = {
  {&(_ZTV3C27[4]),  4,9},
  {&(_ZTV3C27[8]),  8,9},
};
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
static VTBL_ENTRY alt_thunk_names3[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C27 = {  "C27", // class name
  bases_C27, 2,
  &(vtc_C27[0]), // expected_vtbl_contents
  &(vtt_C27[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C27),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C27),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C27),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names3,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C28  : A0 , virtual B1 {
  int fc;
  virtual void  foo(); // _ZN3C283fooEv
  ~C28(); // tgen
  C28(); // tgen
};
//SIG(-1 C28) C1{ BC2{ Fi} VBC3{ v1 Fi} v1 Fi}


void  C28 ::foo(){vfunc_called(this, "_ZN3C283fooEv");}
C28 ::~C28(){ note_dtor("C28", this);} // tgen
C28 ::C28(){ note_ctor("C28", this);} // tgen

static void Test_C28()
{
  extern Class_Descriptor cd_C28;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C28, buf);
    C28 *dp, &lv = *(dp=new (buf) C28());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C28)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C28)");
    check_base_class_offset(lv, (A0*), ABISELECT(8,4), "C28");
    check_base_class_offset(lv, (B1*), ABISELECT(16,12), "C28");
    check_field_offset(lv, fc, ABISELECT(12,8), "C28.fc");
    test_class_info(&lv, &cd_C28);
    dp->~C28();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC28(Test_C28, "C28", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C28C1Ev();
extern void _ZN3C28D1Ev();
Name_Map name_map_C28[] = {
  NSPAIR(_ZN3C28C1Ev),
  NSPAIR(_ZN3C28D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C28[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C28[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C28[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV3C28[];
static  VTT_ENTRY vtt_C28[] = {
  {&(_ZTV3C28[3]),  3,8},
  {&(_ZTV3C28[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
static VTBL_ENTRY alt_thunk_names4[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C28 = {  "C28", // class name
  bases_C28, 2,
  &(vtc_C28[0]), // expected_vtbl_contents
  &(vtt_C28[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C28),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C28),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C28),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names4,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C29  : A1 , virtual B1 {
  int fc;
  virtual void  foo(); // _ZN3C293fooEv
  ~C29(); // tgen
  C29(); // tgen
};
//SIG(-1 C29) C1{ BC2{ v1 Fi} VBC3{ v1 Fi} v1 Fi}


void  C29 ::foo(){vfunc_called(this, "_ZN3C293fooEv");}
C29 ::~C29(){ note_dtor("C29", this);} // tgen
C29 ::C29(){ note_ctor("C29", this);} // tgen

static void Test_C29()
{
  extern Class_Descriptor cd_C29;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C29, buf);
    C29 *dp, &lv = *(dp=new (buf) C29());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C29)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C29)");
    check_base_class_offset(lv, (A1*), 0, "C29");
    check_base_class_offset(lv, (B1*), ABISELECT(16,12), "C29");
    check_field_offset(lv, fc, ABISELECT(12,8), "C29.fc");
    test_class_info(&lv, &cd_C29);
    dp->~C29();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC29(Test_C29, "C29", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C29C1Ev();
extern void _ZN3C29D1Ev();
Name_Map name_map_C29[] = {
  NSPAIR(_ZN3C29C1Ev),
  NSPAIR(_ZN3C29D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C29[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C29[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C29[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV3C29[];
static  VTT_ENTRY vtt_C29[] = {
  {&(_ZTV3C29[3]),  3,8},
  {&(_ZTV3C29[7]),  7,8},
};
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
static VTBL_ENTRY alt_thunk_names5[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C29 = {  "C29", // class name
  bases_C29, 2,
  &(vtc_C29[0]), // expected_vtbl_contents
  &(vtt_C29[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C29),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C29),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C29),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names5,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C30  : virtual A0 , virtual B1 {
  int fc;
  virtual void  foo(); // _ZN3C303fooEv
  ~C30(); // tgen
  C30(); // tgen
};
//SIG(-1 C30) C1{ VBC2{ Fi} VBC3{ v1 Fi} v1 Fi}


void  C30 ::foo(){vfunc_called(this, "_ZN3C303fooEv");}
C30 ::~C30(){ note_dtor("C30", this);} // tgen
C30 ::C30(){ note_ctor("C30", this);} // tgen

static void Test_C30()
{
  extern Class_Descriptor cd_C30;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,6)];
    init_test(&cd_C30, buf);
    C30 *dp, &lv = *(dp=new (buf) C30());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,20), "sizeof(C30)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C30)");
    check_base_class_offset(lv, (A0*), ABISELECT(12,8), "C30");
    check_base_class_offset(lv, (B1*), ABISELECT(16,12), "C30");
    check_field_offset(lv, fc, ABISELECT(8,4), "C30.fc");
    test_class_info(&lv, &cd_C30);
    dp->~C30();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC30(Test_C30, "C30", ABISELECT(32,20));

#else // __cplusplus

extern void _ZN3C30C1Ev();
extern void _ZN3C30D1Ev();
Name_Map name_map_C30[] = {
  NSPAIR(_ZN3C30C1Ev),
  NSPAIR(_ZN3C30D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C30[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C30[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C30[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV3C30[];
static  VTT_ENTRY vtt_C30[] = {
  {&(_ZTV3C30[4]),  4,9},
  {&(_ZTV3C30[8]),  8,9},
};
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
static VTBL_ENTRY alt_thunk_names6[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C30 = {  "C30", // class name
  bases_C30, 2,
  &(vtc_C30[0]), // expected_vtbl_contents
  &(vtt_C30[0]), // expected_vtt_contents
  ABISELECT(32,20), // object size
  NSPAIRA(_ZTI3C30),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C30),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C30),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names6,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  C31  : virtual A1 , virtual B1 {
  int fc;
  virtual void  foo(); // _ZN3C313fooEv
  ~C31(); // tgen
  C31(); // tgen
};
//SIG(-1 C31) C1{ VBC2{ v1 Fi} VBC3{ v1 Fi} v1 Fi}


void  C31 ::foo(){vfunc_called(this, "_ZN3C313fooEv");}
C31 ::~C31(){ note_dtor("C31", this);} // tgen
C31 ::C31(){ note_ctor("C31", this);} // tgen

static void Test_C31()
{
  extern Class_Descriptor cd_C31;
  void *lvp;
  {
    ABISELECT(double,int) buf[7];
    init_test(&cd_C31, buf);
    C31 *dp, &lv = *(dp=new (buf) C31());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,24), "sizeof(C31)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(C31)");
    check_base_class_offset(lv, (A1*), ABISELECT(16,8), "C31");
    check_base_class_offset(lv, (B1*), ABISELECT(32,16), "C31");
    check_field_offset(lv, fc, ABISELECT(8,4), "C31.fc");
    test_class_info(&lv, &cd_C31);
    dp->~C31();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vC31(Test_C31, "C31", ABISELECT(48,24));

#else // __cplusplus

extern void _ZN3C31C1Ev();
extern void _ZN3C31D1Ev();
Name_Map name_map_C31[] = {
  NSPAIR(_ZN3C31C1Ev),
  NSPAIR(_ZN3C31D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
static Base_Class bases_C31[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI3C31[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_C31[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV3C31[];
static  VTT_ENTRY vtt_C31[] = {
  {&(_ZTV3C31[4]),  4,13},
  {&(_ZTV3C31[8]),  8,13},
  {&(_ZTV3C31[12]),  12,13},
};
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
static VTBL_ENTRY alt_thunk_names7[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_C31 = {  "C31", // class name
  bases_C31, 2,
  &(vtc_C31[0]), // expected_vtbl_contents
  &(vtt_C31[0]), // expected_vtt_contents
  ABISELECT(48,24), // object size
  NSPAIRA(_ZTI3C31),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV3C31),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT3C31),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names7,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E0x4  : C0 , D0 {
  int fd;
};
//SIG(-1 E0x4) C1{ BC2{ BC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}



static void Test_E0x4()
{
  extern Class_Descriptor cd_E0x4;
  void *lvp;
  {
    int buf[6];
    init_test(&cd_E0x4, buf);
    E0x4 &lv = *(new (buf) E0x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), 20, "sizeof(E0x4)");
    check2(__alignof__(lv), 4, "__alignof__(E0x4)");
    check_base_class_offset(lv, (A0*)(C0*), 0, "E0x4");
    check_base_class_offset(lv, (B0*)(C0*), 4, "E0x4");
    check_base_class_offset(lv, (C0*), 0, "E0x4");
    check_base_class_offset(lv, (D0*), 12, "E0x4");
    check_field_offset(lv, fd, 16, "E0x4.fd");
    test_class_info(&lv, &cd_E0x4);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x4(Test_E0x4, "E0x4", 20);

#else // __cplusplus

extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E0x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    4, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    12, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E0x4[];
Class_Descriptor cd_E0x4 = {  "E0x4", // class name
  bases_E0x4, 4,
  0, // no vftv
  0, //no vtt
  20, // object size
  NSPAIRA(_ZTI4E0x4),ABISELECT(56,32), //typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y0  : E0x4 , F1 {
  int ff;
  ~G0x4y0(); // tgen
  G0x4y0(); // tgen
};
//SIG(1 G0x4y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x4y0 ::~G0x4y0(){ note_dtor("G0x4y0", this);} // tgen
G0x4y0 ::G0x4y0(){ note_ctor("G0x4y0", this);} // tgen

static void Test_G0x4y0()
{
  extern Class_Descriptor cd_G0x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x4y0, buf);
    G0x4y0 *dp, &lv = *(dp=new (buf) G0x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y0)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(12,8), "G0x4y0");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(16,12), "G0x4y0");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(12,8), "G0x4y0");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(24,20), "G0x4y0");
    check_base_class_offset(lv, (E0x4*), ABISELECT(12,8), "G0x4y0");
    check_base_class_offset(lv, (F1*), 0, "G0x4y0");
    check_field_offset(lv, ff, ABISELECT(32,28), "G0x4y0.ff");
    test_class_info(&lv, &cd_G0x4y0);
    dp->~G0x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y0(Test_G0x4y0, "G0x4y0", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x4y0C1Ev();
extern void _ZN6G0x4y0D1Ev();
Name_Map name_map_G0x4y0[] = {
  NSPAIR(_ZN6G0x4y0C1Ev),
  NSPAIR(_ZN6G0x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI6G0x4y0[];
extern  VTBL_ENTRY _ZTV6G0x4y0[];
Class_Descriptor cd_G0x4y0 = {  "G0x4y0", // class name
  bases_G0x4y0, 6,
  &(vtc_G0x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y0),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y1  : virtual E0x4 , F1 {
  int ff;
  ~G0x4y1(); // tgen
  G0x4y1(); // tgen
};
//SIG(1 G0x4y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x4y1 ::~G0x4y1(){ note_dtor("G0x4y1", this);} // tgen
G0x4y1 ::G0x4y1(){ note_ctor("G0x4y1", this);} // tgen

static void Test_G0x4y1()
{
  extern Class_Descriptor cd_G0x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x4y1, buf);
    G0x4y1 *dp, &lv = *(dp=new (buf) G0x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y1)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(16,12), "G0x4y1");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(20,16), "G0x4y1");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(16,12), "G0x4y1");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(28,24), "G0x4y1");
    check_base_class_offset(lv, (E0x4*), ABISELECT(16,12), "G0x4y1");
    check_base_class_offset(lv, (F1*), 0, "G0x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x4y1.ff");
    test_class_info(&lv, &cd_G0x4y1);
    dp->~G0x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y1(Test_G0x4y1, "G0x4y1", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x4y1C1Ev();
extern void _ZN6G0x4y1D1Ev();
Name_Map name_map_G0x4y1[] = {
  NSPAIR(_ZN6G0x4y1C1Ev),
  NSPAIR(_ZN6G0x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x4y1[];
static  VTT_ENTRY vtt_G0x4y1[] = {
  {&(_ZTV6G0x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G0x4y1[];
extern  VTBL_ENTRY _ZTV6G0x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x4y1[];
Class_Descriptor cd_G0x4y1 = {  "G0x4y1", // class name
  bases_G0x4y1, 6,
  &(vtc_G0x4y1[0]), // expected_vtbl_contents
  &(vtt_G0x4y1[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y1),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x4y1),1, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y2  : E0x4 , virtual F1 {
  int ff;
  ~G0x4y2(); // tgen
  G0x4y2(); // tgen
};
//SIG(1 G0x4y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x4y2 ::~G0x4y2(){ note_dtor("G0x4y2", this);} // tgen
G0x4y2 ::G0x4y2(){ note_ctor("G0x4y2", this);} // tgen

static void Test_G0x4y2()
{
  extern Class_Descriptor cd_G0x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x4y2, buf);
    G0x4y2 *dp, &lv = *(dp=new (buf) G0x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y2)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(8,4), "G0x4y2");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(12,8), "G0x4y2");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(8,4), "G0x4y2");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(20,16), "G0x4y2");
    check_base_class_offset(lv, (E0x4*), ABISELECT(8,4), "G0x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x4y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G0x4y2.ff");
    test_class_info(&lv, &cd_G0x4y2);
    dp->~G0x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y2(Test_G0x4y2, "G0x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x4y2C1Ev();
extern void _ZN6G0x4y2D1Ev();
Name_Map name_map_G0x4y2[] = {
  NSPAIR(_ZN6G0x4y2C1Ev),
  NSPAIR(_ZN6G0x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x4y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G0x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x4y2[];
static  VTT_ENTRY vtt_G0x4y2[] = {
  {&(_ZTV6G0x4y2[3]),  3,7},
  {&(_ZTV6G0x4y2[6]),  6,7},
};
extern VTBL_ENTRY _ZTI6G0x4y2[];
extern  VTBL_ENTRY _ZTV6G0x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x4y2[];
Class_Descriptor cd_G0x4y2 = {  "G0x4y2", // class name
  bases_G0x4y2, 6,
  &(vtc_G0x4y2[0]), // expected_vtbl_contents
  &(vtt_G0x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y2),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x4y2),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y3  : virtual E0x4 , virtual F1 {
  int ff;
  ~G0x4y3(); // tgen
  G0x4y3(); // tgen
};
//SIG(1 G0x4y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x4y3 ::~G0x4y3(){ note_dtor("G0x4y3", this);} // tgen
G0x4y3 ::G0x4y3(){ note_ctor("G0x4y3", this);} // tgen

static void Test_G0x4y3()
{
  extern Class_Descriptor cd_G0x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x4y3, buf);
    G0x4y3 *dp, &lv = *(dp=new (buf) G0x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y3)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(12,8), "G0x4y3");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(16,12), "G0x4y3");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(12,8), "G0x4y3");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(24,20), "G0x4y3");
    check_base_class_offset(lv, (E0x4*), ABISELECT(12,8), "G0x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x4y3.ff");
    test_class_info(&lv, &cd_G0x4y3);
    dp->~G0x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y3(Test_G0x4y3, "G0x4y3", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x4y3C1Ev();
extern void _ZN6G0x4y3D1Ev();
Name_Map name_map_G0x4y3[] = {
  NSPAIR(_ZN6G0x4y3C1Ev),
  NSPAIR(_ZN6G0x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x4y3[] = {
  ABISELECT(32,28),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y3[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G0x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x4y3[];
static  VTT_ENTRY vtt_G0x4y3[] = {
  {&(_ZTV6G0x4y3[4]),  4,8},
  {&(_ZTV6G0x4y3[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G0x4y3[];
extern  VTBL_ENTRY _ZTV6G0x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x4y3[];
Class_Descriptor cd_G0x4y3 = {  "G0x4y3", // class name
  bases_G0x4y3, 6,
  &(vtc_G0x4y3[0]), // expected_vtbl_contents
  &(vtt_G0x4y3[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y3),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x4y3),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y4  : E0x4 , F0 {
  int ff;
};
//SIG(1 G0x4y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}



static void Test_G0x4y4()
{
  extern Class_Descriptor cd_G0x4y4;
  void *lvp;
  {
    int buf[8];
    init_test(&cd_G0x4y4, buf);
    G0x4y4 &lv = *(new (buf) G0x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), 28, "sizeof(G0x4y4)");
    check2(__alignof__(lv), 4, "__alignof__(G0x4y4)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), 0, "G0x4y4");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), 4, "G0x4y4");
    check_base_class_offset(lv, (C0*)(E0x4*), 0, "G0x4y4");
    check_base_class_offset(lv, (D0*)(E0x4*), 12, "G0x4y4");
    check_base_class_offset(lv, (E0x4*), 0, "G0x4y4");
    check_base_class_offset(lv, (F0*), 20, "G0x4y4");
    check_field_offset(lv, ff, 24, "G0x4y4.ff");
    test_class_info(&lv, &cd_G0x4y4);
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y4(Test_G0x4y4, "G0x4y4", 28);

#else // __cplusplus

extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    4, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    12, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    20, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
Class_Descriptor cd_G0x4y4 = {  "G0x4y4", // class name
  bases_G0x4y4, 6,
  0, // no vftv
  0, //no vtt
  28, // object size
  {0,0},0, // typeinfo_var
  {0,0},0, // virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  0, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y5  : virtual E0x4 , F0 {
  int ff;
  ~G0x4y5(); // tgen
  G0x4y5(); // tgen
};
//SIG(1 G0x4y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G0x4y5 ::~G0x4y5(){ note_dtor("G0x4y5", this);} // tgen
G0x4y5 ::G0x4y5(){ note_ctor("G0x4y5", this);} // tgen

static void Test_G0x4y5()
{
  extern Class_Descriptor cd_G0x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x4y5, buf);
    G0x4y5 *dp, &lv = *(dp=new (buf) G0x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y5)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(16,12), "G0x4y5");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(20,16), "G0x4y5");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(16,12), "G0x4y5");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(28,24), "G0x4y5");
    check_base_class_offset(lv, (E0x4*), ABISELECT(16,12), "G0x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x4y5.ff");
    test_class_info(&lv, &cd_G0x4y5);
    dp->~G0x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y5(Test_G0x4y5, "G0x4y5", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x4y5C1Ev();
extern void _ZN6G0x4y5D1Ev();
Name_Map name_map_G0x4y5[] = {
  NSPAIR(_ZN6G0x4y5C1Ev),
  NSPAIR(_ZN6G0x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y5[];
static  VTBL_ENTRY vtc_G0x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y5[0]),
};
extern VTBL_ENTRY _ZTV6G0x4y5[];
static  VTT_ENTRY vtt_G0x4y5[] = {
  {&(_ZTV6G0x4y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x4y5[];
extern  VTBL_ENTRY _ZTV6G0x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x4y5[];
Class_Descriptor cd_G0x4y5 = {  "G0x4y5", // class name
  bases_G0x4y5, 6,
  &(vtc_G0x4y5[0]), // expected_vtbl_contents
  &(vtt_G0x4y5[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y5),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x4y5),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y6  : E0x4 , virtual F0 {
  int ff;
  ~G0x4y6(); // tgen
  G0x4y6(); // tgen
};
//SIG(1 G0x4y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x4y6 ::~G0x4y6(){ note_dtor("G0x4y6", this);} // tgen
G0x4y6 ::G0x4y6(){ note_ctor("G0x4y6", this);} // tgen

static void Test_G0x4y6()
{
  extern Class_Descriptor cd_G0x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x4y6, buf);
    G0x4y6 *dp, &lv = *(dp=new (buf) G0x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y6)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(8,4), "G0x4y6");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(12,8), "G0x4y6");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(8,4), "G0x4y6");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(20,16), "G0x4y6");
    check_base_class_offset(lv, (E0x4*), ABISELECT(8,4), "G0x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x4y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G0x4y6.ff");
    test_class_info(&lv, &cd_G0x4y6);
    dp->~G0x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y6(Test_G0x4y6, "G0x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x4y6C1Ev();
extern void _ZN6G0x4y6D1Ev();
Name_Map name_map_G0x4y6[] = {
  NSPAIR(_ZN6G0x4y6C1Ev),
  NSPAIR(_ZN6G0x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y6[];
static  VTBL_ENTRY vtc_G0x4y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y6[0]),
};
extern VTBL_ENTRY _ZTV6G0x4y6[];
static  VTT_ENTRY vtt_G0x4y6[] = {
  {&(_ZTV6G0x4y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x4y6[];
extern  VTBL_ENTRY _ZTV6G0x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x4y6[];
Class_Descriptor cd_G0x4y6 = {  "G0x4y6", // class name
  bases_G0x4y6, 6,
  &(vtc_G0x4y6[0]), // expected_vtbl_contents
  &(vtt_G0x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y6),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x4y6),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x4y7  : virtual E0x4 , virtual F0 {
  int ff;
  ~G0x4y7(); // tgen
  G0x4y7(); // tgen
};
//SIG(1 G0x4y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x4y7 ::~G0x4y7(){ note_dtor("G0x4y7", this);} // tgen
G0x4y7 ::G0x4y7(){ note_ctor("G0x4y7", this);} // tgen

static void Test_G0x4y7()
{
  extern Class_Descriptor cd_G0x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x4y7, buf);
    G0x4y7 *dp, &lv = *(dp=new (buf) G0x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x4y7)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x4*), ABISELECT(12,8), "G0x4y7");
    check_base_class_offset(lv, (B0*)(C0*)(E0x4*), ABISELECT(16,12), "G0x4y7");
    check_base_class_offset(lv, (C0*)(E0x4*), ABISELECT(12,8), "G0x4y7");
    check_base_class_offset(lv, (D0*)(E0x4*), ABISELECT(24,20), "G0x4y7");
    check_base_class_offset(lv, (E0x4*), ABISELECT(12,8), "G0x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x4y7.ff");
    test_class_info(&lv, &cd_G0x4y7);
    dp->~G0x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x4y7(Test_G0x4y7, "G0x4y7", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x4y7C1Ev();
extern void _ZN6G0x4y7D1Ev();
Name_Map name_map_G0x4y7[] = {
  NSPAIR(_ZN6G0x4y7C1Ev),
  NSPAIR(_ZN6G0x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x4;
extern VTBL_ENTRY _ZTI4E0x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x4,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x4y7[];
static  VTBL_ENTRY vtc_G0x4y7[] = {
  ABISELECT(32,28),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x4y7[0]),
};
extern VTBL_ENTRY _ZTV6G0x4y7[];
static  VTT_ENTRY vtt_G0x4y7[] = {
  {&(_ZTV6G0x4y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x4y7[];
extern  VTBL_ENTRY _ZTV6G0x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x4y7[];
Class_Descriptor cd_G0x4y7 = {  "G0x4y7", // class name
  bases_G0x4y7, 6,
  &(vtc_G0x4y7[0]), // expected_vtbl_contents
  &(vtt_G0x4y7[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x4y7),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x4y7),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E1x4  : C1 , D0 {
  int fd;
  ~E1x4(); // tgen
  E1x4(); // tgen
};
//SIG(-1 E1x4) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E1x4 ::~E1x4(){ note_dtor("E1x4", this);} // tgen
E1x4 ::E1x4(){ note_ctor("E1x4", this);} // tgen

static void Test_E1x4()
{
  extern Class_Descriptor cd_E1x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E1x4, buf);
    E1x4 *dp, &lv = *(dp=new (buf) E1x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E1x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x4)");
    check_base_class_offset(lv, (A1*)(C1*), 0, "E1x4");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(12,8), "E1x4");
    check_base_class_offset(lv, (C1*), 0, "E1x4");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E1x4");
    check_field_offset(lv, fd, ABISELECT(24,20), "E1x4.fd");
    test_class_info(&lv, &cd_E1x4);
    dp->~E1x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x4(Test_E1x4, "E1x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E1x4C1Ev();
extern void _ZN4E1x4D1Ev();
Name_Map name_map_E1x4[] = {
  NSPAIR(_ZN4E1x4C1Ev),
  NSPAIR(_ZN4E1x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E1x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E1x4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E1x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI4E1x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
Class_Descriptor cd_E1x4 = {  "E1x4", // class name
  bases_E1x4, 4,
  &(vtc_E1x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E1x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E1x4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y0  : E1x4 , F1 {
  int ff;
  ~G1x4y0(); // tgen
  G1x4y0(); // tgen
};
//SIG(1 G1x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x4y0 ::~G1x4y0(){ note_dtor("G1x4y0", this);} // tgen
G1x4y0 ::G1x4y0(){ note_ctor("G1x4y0", this);} // tgen

static void Test_G1x4y0()
{
  extern Class_Descriptor cd_G1x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x4y0, buf);
    G1x4y0 *dp, &lv = *(dp=new (buf) G1x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y0)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), 0, "G1x4y0");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(12,8), "G1x4y0");
    check_base_class_offset(lv, (C1*)(E1x4*), 0, "G1x4y0");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(20,16), "G1x4y0");
    check_base_class_offset(lv, (E1x4*), 0, "G1x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G1x4y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G1x4y0.ff");
    test_class_info(&lv, &cd_G1x4y0);
    dp->~G1x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y0(Test_G1x4y0, "G1x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x4y0C1Ev();
extern void _ZN6G1x4y0D1Ev();
Name_Map name_map_G1x4y0[] = {
  NSPAIR(_ZN6G1x4y0C1Ev),
  NSPAIR(_ZN6G1x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,24), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y0[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G1x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI6G1x4y0[];
extern  VTBL_ENTRY _ZTV6G1x4y0[];
Class_Descriptor cd_G1x4y0 = {  "G1x4y0", // class name
  bases_G1x4y0, 6,
  &(vtc_G1x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y0),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y1  : virtual E1x4 , F1 {
  int ff;
  ~G1x4y1(); // tgen
  G1x4y1(); // tgen
};
//SIG(1 G1x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x4y1 ::~G1x4y1(){ note_dtor("G1x4y1", this);} // tgen
G1x4y1 ::G1x4y1(){ note_ctor("G1x4y1", this);} // tgen

static void Test_G1x4y1()
{
  extern Class_Descriptor cd_G1x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x4y1, buf);
    G1x4y1 *dp, &lv = *(dp=new (buf) G1x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y1)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), ABISELECT(16,12), "G1x4y1");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(28,20), "G1x4y1");
    check_base_class_offset(lv, (C1*)(E1x4*), ABISELECT(16,12), "G1x4y1");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(36,28), "G1x4y1");
    check_base_class_offset(lv, (E1x4*), ABISELECT(16,12), "G1x4y1");
    check_base_class_offset(lv, (F1*), 0, "G1x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x4y1.ff");
    test_class_info(&lv, &cd_G1x4y1);
    dp->~G1x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y1(Test_G1x4y1, "G1x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x4y1C1Ev();
extern void _ZN6G1x4y1D1Ev();
Name_Map name_map_G1x4y1[] = {
  NSPAIR(_ZN6G1x4y1C1Ev),
  NSPAIR(_ZN6G1x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x4y1[];
static  VTT_ENTRY vtt_G1x4y1[] = {
  {&(_ZTV6G1x4y1[3]),  3,8},
  {&(_ZTV6G1x4y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G1x4y1[];
extern  VTBL_ENTRY _ZTV6G1x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x4y1[];
Class_Descriptor cd_G1x4y1 = {  "G1x4y1", // class name
  bases_G1x4y1, 6,
  &(vtc_G1x4y1[0]), // expected_vtbl_contents
  &(vtt_G1x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x4y1),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y2  : E1x4 , virtual F1 {
  int ff;
  ~G1x4y2(); // tgen
  G1x4y2(); // tgen
};
//SIG(1 G1x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x4y2 ::~G1x4y2(){ note_dtor("G1x4y2", this);} // tgen
G1x4y2 ::G1x4y2(){ note_ctor("G1x4y2", this);} // tgen

static void Test_G1x4y2()
{
  extern Class_Descriptor cd_G1x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x4y2, buf);
    G1x4y2 *dp, &lv = *(dp=new (buf) G1x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y2)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), 0, "G1x4y2");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(12,8), "G1x4y2");
    check_base_class_offset(lv, (C1*)(E1x4*), 0, "G1x4y2");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(20,16), "G1x4y2");
    check_base_class_offset(lv, (E1x4*), 0, "G1x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G1x4y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G1x4y2.ff");
    test_class_info(&lv, &cd_G1x4y2);
    dp->~G1x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y2(Test_G1x4y2, "G1x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x4y2C1Ev();
extern void _ZN6G1x4y2D1Ev();
Name_Map name_map_G1x4y2[] = {
  NSPAIR(_ZN6G1x4y2C1Ev),
  NSPAIR(_ZN6G1x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x4y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G1x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x4y2[];
static  VTT_ENTRY vtt_G1x4y2[] = {
  {&(_ZTV6G1x4y2[3]),  3,8},
  {&(_ZTV6G1x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G1x4y2[];
extern  VTBL_ENTRY _ZTV6G1x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x4y2[];
Class_Descriptor cd_G1x4y2 = {  "G1x4y2", // class name
  bases_G1x4y2, 6,
  &(vtc_G1x4y2[0]), // expected_vtbl_contents
  &(vtt_G1x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x4y2),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y3  : virtual E1x4 , virtual F1 {
  int ff;
  ~G1x4y3(); // tgen
  G1x4y3(); // tgen
};
//SIG(1 G1x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x4y3 ::~G1x4y3(){ note_dtor("G1x4y3", this);} // tgen
G1x4y3 ::G1x4y3(){ note_ctor("G1x4y3", this);} // tgen

static void Test_G1x4y3()
{
  extern Class_Descriptor cd_G1x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x4y3, buf);
    G1x4y3 *dp, &lv = *(dp=new (buf) G1x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y3)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), ABISELECT(16,8), "G1x4y3");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(28,16), "G1x4y3");
    check_base_class_offset(lv, (C1*)(E1x4*), ABISELECT(16,8), "G1x4y3");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(36,24), "G1x4y3");
    check_base_class_offset(lv, (E1x4*), ABISELECT(16,8), "G1x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G1x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x4y3.ff");
    test_class_info(&lv, &cd_G1x4y3);
    dp->~G1x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y3(Test_G1x4y3, "G1x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G1x4y3C1Ev();
extern void _ZN6G1x4y3D1Ev();
Name_Map name_map_G1x4y3[] = {
  NSPAIR(_ZN6G1x4y3C1Ev),
  NSPAIR(_ZN6G1x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G1x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x4y3[];
static  VTT_ENTRY vtt_G1x4y3[] = {
  {&(_ZTV6G1x4y3[4]),  4,12},
  {&(_ZTV6G1x4y3[7]),  7,12},
  {&(_ZTV6G1x4y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G1x4y3[];
extern  VTBL_ENTRY _ZTV6G1x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x4y3[];
Class_Descriptor cd_G1x4y3 = {  "G1x4y3", // class name
  bases_G1x4y3, 6,
  &(vtc_G1x4y3[0]), // expected_vtbl_contents
  &(vtt_G1x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G1x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x4y3),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y4  : E1x4 , F0 {
  int ff;
  ~G1x4y4(); // tgen
  G1x4y4(); // tgen
};
//SIG(1 G1x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G1x4y4 ::~G1x4y4(){ note_dtor("G1x4y4", this);} // tgen
G1x4y4 ::G1x4y4(){ note_ctor("G1x4y4", this);} // tgen

static void Test_G1x4y4()
{
  extern Class_Descriptor cd_G1x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x4y4, buf);
    G1x4y4 *dp, &lv = *(dp=new (buf) G1x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y4)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), 0, "G1x4y4");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(12,8), "G1x4y4");
    check_base_class_offset(lv, (C1*)(E1x4*), 0, "G1x4y4");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(20,16), "G1x4y4");
    check_base_class_offset(lv, (E1x4*), 0, "G1x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G1x4y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G1x4y4.ff");
    test_class_info(&lv, &cd_G1x4y4);
    dp->~G1x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y4(Test_G1x4y4, "G1x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G1x4y4C1Ev();
extern void _ZN6G1x4y4D1Ev();
Name_Map name_map_G1x4y4[] = {
  NSPAIR(_ZN6G1x4y4C1Ev),
  NSPAIR(_ZN6G1x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTI6G1x4y4[];
extern  VTBL_ENTRY _ZTV6G1x4y4[];
Class_Descriptor cd_G1x4y4 = {  "G1x4y4", // class name
  bases_G1x4y4, 6,
  &(vtc_G1x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G1x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y5  : virtual E1x4 , F0 {
  int ff;
  ~G1x4y5(); // tgen
  G1x4y5(); // tgen
};
//SIG(1 G1x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G1x4y5 ::~G1x4y5(){ note_dtor("G1x4y5", this);} // tgen
G1x4y5 ::G1x4y5(){ note_ctor("G1x4y5", this);} // tgen

static void Test_G1x4y5()
{
  extern Class_Descriptor cd_G1x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x4y5, buf);
    G1x4y5 *dp, &lv = *(dp=new (buf) G1x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y5)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), ABISELECT(16,12), "G1x4y5");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(28,20), "G1x4y5");
    check_base_class_offset(lv, (C1*)(E1x4*), ABISELECT(16,12), "G1x4y5");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(36,28), "G1x4y5");
    check_base_class_offset(lv, (E1x4*), ABISELECT(16,12), "G1x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x4y5.ff");
    test_class_info(&lv, &cd_G1x4y5);
    dp->~G1x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y5(Test_G1x4y5, "G1x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x4y5C1Ev();
extern void _ZN6G1x4y5D1Ev();
Name_Map name_map_G1x4y5[] = {
  NSPAIR(_ZN6G1x4y5C1Ev),
  NSPAIR(_ZN6G1x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x4y5[];
static  VTT_ENTRY vtt_G1x4y5[] = {
  {&(_ZTV6G1x4y5[3]),  3,7},
  {&(_ZTV6G1x4y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI6G1x4y5[];
extern  VTBL_ENTRY _ZTV6G1x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x4y5[];
Class_Descriptor cd_G1x4y5 = {  "G1x4y5", // class name
  bases_G1x4y5, 6,
  &(vtc_G1x4y5[0]), // expected_vtbl_contents
  &(vtt_G1x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x4y5),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y6  : E1x4 , virtual F0 {
  int ff;
  ~G1x4y6(); // tgen
  G1x4y6(); // tgen
};
//SIG(1 G1x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x4y6 ::~G1x4y6(){ note_dtor("G1x4y6", this);} // tgen
G1x4y6 ::G1x4y6(){ note_ctor("G1x4y6", this);} // tgen

static void Test_G1x4y6()
{
  extern Class_Descriptor cd_G1x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x4y6, buf);
    G1x4y6 *dp, &lv = *(dp=new (buf) G1x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y6)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), 0, "G1x4y6");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(12,8), "G1x4y6");
    check_base_class_offset(lv, (C1*)(E1x4*), 0, "G1x4y6");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(20,16), "G1x4y6");
    check_base_class_offset(lv, (E1x4*), 0, "G1x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G1x4y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G1x4y6.ff");
    test_class_info(&lv, &cd_G1x4y6);
    dp->~G1x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y6(Test_G1x4y6, "G1x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G1x4y6C1Ev();
extern void _ZN6G1x4y6D1Ev();
Name_Map name_map_G1x4y6[] = {
  NSPAIR(_ZN6G1x4y6C1Ev),
  NSPAIR(_ZN6G1x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x4y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x4y6[];
static  VTT_ENTRY vtt_G1x4y6[] = {
  {&(_ZTV6G1x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x4y6[];
extern  VTBL_ENTRY _ZTV6G1x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x4y6[];
Class_Descriptor cd_G1x4y6 = {  "G1x4y6", // class name
  bases_G1x4y6, 6,
  &(vtc_G1x4y6[0]), // expected_vtbl_contents
  &(vtt_G1x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G1x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x4y6),1, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x4y7  : virtual E1x4 , virtual F0 {
  int ff;
  ~G1x4y7(); // tgen
  G1x4y7(); // tgen
};
//SIG(1 G1x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x4y7 ::~G1x4y7(){ note_dtor("G1x4y7", this);} // tgen
G1x4y7 ::G1x4y7(){ note_ctor("G1x4y7", this);} // tgen

static void Test_G1x4y7()
{
  extern Class_Descriptor cd_G1x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x4y7, buf);
    G1x4y7 *dp, &lv = *(dp=new (buf) G1x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x4y7)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x4*), ABISELECT(16,8), "G1x4y7");
    check_base_class_offset(lv, (B0*)(C1*)(E1x4*), ABISELECT(28,16), "G1x4y7");
    check_base_class_offset(lv, (C1*)(E1x4*), ABISELECT(16,8), "G1x4y7");
    check_base_class_offset(lv, (D0*)(E1x4*), ABISELECT(36,24), "G1x4y7");
    check_base_class_offset(lv, (E1x4*), ABISELECT(16,8), "G1x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G1x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x4y7.ff");
    test_class_info(&lv, &cd_G1x4y7);
    dp->~G1x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x4y7(Test_G1x4y7, "G1x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x4y7C1Ev();
extern void _ZN6G1x4y7D1Ev();
Name_Map name_map_G1x4y7[] = {
  NSPAIR(_ZN6G1x4y7C1Ev),
  NSPAIR(_ZN6G1x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x4;
extern VTBL_ENTRY _ZTI4E1x4[];
extern  VTBL_ENTRY _ZTV4E1x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x4y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x4y7[];
static  VTT_ENTRY vtt_G1x4y7[] = {
  {&(_ZTV6G1x4y7[4]),  4,8},
  {&(_ZTV6G1x4y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G1x4y7[];
extern  VTBL_ENTRY _ZTV6G1x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x4y7[];
Class_Descriptor cd_G1x4y7 = {  "G1x4y7", // class name
  bases_G1x4y7, 6,
  &(vtc_G1x4y7[0]), // expected_vtbl_contents
  &(vtt_G1x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x4y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x4y7),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E2x4  : C2 , D0 {
  int fd;
  ~E2x4(); // tgen
  E2x4(); // tgen
};
//SIG(-1 E2x4) C1{ BC2{ VBC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E2x4 ::~E2x4(){ note_dtor("E2x4", this);} // tgen
E2x4 ::E2x4(){ note_ctor("E2x4", this);} // tgen

static void Test_E2x4()
{
  extern Class_Descriptor cd_E2x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E2x4, buf);
    E2x4 *dp, &lv = *(dp=new (buf) E2x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E2x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x4)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(24,20), "E2x4");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(8,4), "E2x4");
    check_base_class_offset(lv, (C2*), 0, "E2x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E2x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E2x4.fd");
    test_class_info(&lv, &cd_E2x4);
    dp->~E2x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x4(Test_E2x4, "E2x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E2x4C1Ev();
extern void _ZN4E2x4D1Ev();
Name_Map name_map_E2x4[] = {
  NSPAIR(_ZN4E2x4C1Ev),
  NSPAIR(_ZN4E2x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E2x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E2x4[];
static  VTBL_ENTRY vtc_E2x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
extern VTBL_ENTRY _ZTV4E2x4[];
static  VTBL_ENTRY _tg__ZTV2C2__4E2x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x4[] = {
  {&(_ZTV4E2x4[3]),  3,3},
  {&(_tg__ZTV2C2__4E2x4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
Class_Descriptor cd_E2x4 = {  "E2x4", // class name
  bases_E2x4, 4,
  &(vtc_E2x4[0]), // expected_vtbl_contents
  &(vtt_E2x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E2x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E2x4),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E2x4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y0  : E2x4 , F1 {
  int ff;
  ~G2x4y0(); // tgen
  G2x4y0(); // tgen
};
//SIG(1 G2x4y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x4y0 ::~G2x4y0(){ note_dtor("G2x4y0", this);} // tgen
G2x4y0 ::G2x4y0(){ note_ctor("G2x4y0", this);} // tgen

static void Test_G2x4y0()
{
  extern Class_Descriptor cd_G2x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x4y0, buf);
    G2x4y0 *dp, &lv = *(dp=new (buf) G2x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y0)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(40,32), "G2x4y0");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(8,4), "G2x4y0");
    check_base_class_offset(lv, (C2*)(E2x4*), 0, "G2x4y0");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(16,12), "G2x4y0");
    check_base_class_offset(lv, (E2x4*), 0, "G2x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G2x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G2x4y0.ff");
    test_class_info(&lv, &cd_G2x4y0);
    dp->~G2x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y0(Test_G2x4y0, "G2x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x4y0C1Ev();
extern void _ZN6G2x4y0D1Ev();
Name_Map name_map_G2x4y0[] = {
  NSPAIR(_ZN6G2x4y0C1Ev),
  NSPAIR(_ZN6G2x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y0[0]),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G2x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x4y0[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y0[] = {
  {&(_ZTV6G2x4y0[3]),  3,6},
  {&(_tg__ZTV4E2x4__6G2x4y0[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y0[];
extern  VTBL_ENTRY _ZTV6G2x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y0[];
Class_Descriptor cd_G2x4y0 = {  "G2x4y0", // class name
  bases_G2x4y0, 6,
  &(vtc_G2x4y0[0]), // expected_vtbl_contents
  &(vtt_G2x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y0),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y1  : virtual E2x4 , F1 {
  int ff;
  ~G2x4y1(); // tgen
  G2x4y1(); // tgen
};
//SIG(1 G2x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x4y1 ::~G2x4y1(){ note_dtor("G2x4y1", this);} // tgen
G2x4y1 ::G2x4y1(){ note_ctor("G2x4y1", this);} // tgen

static void Test_G2x4y1()
{
  extern Class_Descriptor cd_G2x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x4y1, buf);
    G2x4y1 *dp, &lv = *(dp=new (buf) G2x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y1)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(40,32), "G2x4y1");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(24,16), "G2x4y1");
    check_base_class_offset(lv, (C2*)(E2x4*), ABISELECT(16,12), "G2x4y1");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(32,24), "G2x4y1");
    check_base_class_offset(lv, (E2x4*), ABISELECT(16,12), "G2x4y1");
    check_base_class_offset(lv, (F1*), 0, "G2x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x4y1.ff");
    test_class_info(&lv, &cd_G2x4y1);
    dp->~G2x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y1(Test_G2x4y1, "G2x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x4y1C1Ev();
extern void _ZN6G2x4y1D1Ev();
Name_Map name_map_G2x4y1[] = {
  NSPAIR(_ZN6G2x4y1C1Ev),
  NSPAIR(_ZN6G2x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x4y1[0]),
};
extern VTBL_ENTRY _ZTV6G2x4y1[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y1[] = {
  {&(_ZTV6G2x4y1[4]),  4,8},
  {&(_ZTV6G2x4y1[8]),  8,8},
  {&(_tg__ZTV4E2x4__6G2x4y1[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y1[];
extern  VTBL_ENTRY _ZTV6G2x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y1[];
Class_Descriptor cd_G2x4y1 = {  "G2x4y1", // class name
  bases_G2x4y1, 6,
  &(vtc_G2x4y1[0]), // expected_vtbl_contents
  &(vtt_G2x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y1),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y2  : E2x4 , virtual F1 {
  int ff;
  ~G2x4y2(); // tgen
  G2x4y2(); // tgen
};
//SIG(1 G2x4y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x4y2 ::~G2x4y2(){ note_dtor("G2x4y2", this);} // tgen
G2x4y2 ::G2x4y2(){ note_ctor("G2x4y2", this);} // tgen

static void Test_G2x4y2()
{
  extern Class_Descriptor cd_G2x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x4y2, buf);
    G2x4y2 *dp, &lv = *(dp=new (buf) G2x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y2)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(28,24), "G2x4y2");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(8,4), "G2x4y2");
    check_base_class_offset(lv, (C2*)(E2x4*), 0, "G2x4y2");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(16,12), "G2x4y2");
    check_base_class_offset(lv, (E2x4*), 0, "G2x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G2x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G2x4y2.ff");
    test_class_info(&lv, &cd_G2x4y2);
    dp->~G2x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y2(Test_G2x4y2, "G2x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x4y2C1Ev();
extern void _ZN6G2x4y2D1Ev();
Name_Map name_map_G2x4y2[] = {
  NSPAIR(_ZN6G2x4y2C1Ev),
  NSPAIR(_ZN6G2x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G2x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x4y2[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y2[] = {
  {&(_ZTV6G2x4y2[4]),  4,8},
  {&(_tg__ZTV4E2x4__6G2x4y2[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y2[3]),  3,3},
  {&(_ZTV6G2x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G2x4y2[];
extern  VTBL_ENTRY _ZTV6G2x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y2[];
Class_Descriptor cd_G2x4y2 = {  "G2x4y2", // class name
  bases_G2x4y2, 6,
  &(vtc_G2x4y2[0]), // expected_vtbl_contents
  &(vtt_G2x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y2),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y3  : virtual E2x4 , virtual F1 {
  int ff;
  ~G2x4y3(); // tgen
  G2x4y3(); // tgen
};
//SIG(1 G2x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x4y3 ::~G2x4y3(){ note_dtor("G2x4y3", this);} // tgen
G2x4y3 ::G2x4y3(){ note_ctor("G2x4y3", this);} // tgen

static void Test_G2x4y3()
{
  extern Class_Descriptor cd_G2x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x4y3, buf);
    G2x4y3 *dp, &lv = *(dp=new (buf) G2x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y3)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(40,28), "G2x4y3");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(24,12), "G2x4y3");
    check_base_class_offset(lv, (C2*)(E2x4*), ABISELECT(16,8), "G2x4y3");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(32,20), "G2x4y3");
    check_base_class_offset(lv, (E2x4*), ABISELECT(16,8), "G2x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G2x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x4y3.ff");
    test_class_info(&lv, &cd_G2x4y3);
    dp->~G2x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y3(Test_G2x4y3, "G2x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G2x4y3C1Ev();
extern void _ZN6G2x4y3D1Ev();
Name_Map name_map_G2x4y3[] = {
  NSPAIR(_ZN6G2x4y3C1Ev),
  NSPAIR(_ZN6G2x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y3[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x4y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G2x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x4y3[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y3[] = {
  {&(_ZTV6G2x4y3[5]),  5,12},
  {&(_ZTV6G2x4y3[8]),  8,12},
  {&(_ZTV6G2x4y3[11]),  11,12},
  {&(_tg__ZTV4E2x4__6G2x4y3[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y3[];
extern  VTBL_ENTRY _ZTV6G2x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y3[];
Class_Descriptor cd_G2x4y3 = {  "G2x4y3", // class name
  bases_G2x4y3, 6,
  &(vtc_G2x4y3[0]), // expected_vtbl_contents
  &(vtt_G2x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G2x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y3),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y4  : E2x4 , F0 {
  int ff;
  ~G2x4y4(); // tgen
  G2x4y4(); // tgen
};
//SIG(1 G2x4y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G2x4y4 ::~G2x4y4(){ note_dtor("G2x4y4", this);} // tgen
G2x4y4 ::G2x4y4(){ note_ctor("G2x4y4", this);} // tgen

static void Test_G2x4y4()
{
  extern Class_Descriptor cd_G2x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x4y4, buf);
    G2x4y4 *dp, &lv = *(dp=new (buf) G2x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y4)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(32,28), "G2x4y4");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(8,4), "G2x4y4");
    check_base_class_offset(lv, (C2*)(E2x4*), 0, "G2x4y4");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(16,12), "G2x4y4");
    check_base_class_offset(lv, (E2x4*), 0, "G2x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G2x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G2x4y4.ff");
    test_class_info(&lv, &cd_G2x4y4);
    dp->~G2x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y4(Test_G2x4y4, "G2x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G2x4y4C1Ev();
extern void _ZN6G2x4y4D1Ev();
Name_Map name_map_G2x4y4[] = {
  NSPAIR(_ZN6G2x4y4C1Ev),
  NSPAIR(_ZN6G2x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y4[];
static  VTBL_ENTRY vtc_G2x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y4[0]),
};
extern VTBL_ENTRY _ZTV6G2x4y4[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y4[] = {
  {&(_ZTV6G2x4y4[3]),  3,3},
  {&(_tg__ZTV4E2x4__6G2x4y4[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y4[];
extern  VTBL_ENTRY _ZTV6G2x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y4[];
Class_Descriptor cd_G2x4y4 = {  "G2x4y4", // class name
  bases_G2x4y4, 6,
  &(vtc_G2x4y4[0]), // expected_vtbl_contents
  &(vtt_G2x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G2x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y4),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y5  : virtual E2x4 , F0 {
  int ff;
  ~G2x4y5(); // tgen
  G2x4y5(); // tgen
};
//SIG(1 G2x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G2x4y5 ::~G2x4y5(){ note_dtor("G2x4y5", this);} // tgen
G2x4y5 ::G2x4y5(){ note_ctor("G2x4y5", this);} // tgen

static void Test_G2x4y5()
{
  extern Class_Descriptor cd_G2x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x4y5, buf);
    G2x4y5 *dp, &lv = *(dp=new (buf) G2x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y5)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(40,32), "G2x4y5");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(24,16), "G2x4y5");
    check_base_class_offset(lv, (C2*)(E2x4*), ABISELECT(16,12), "G2x4y5");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(32,24), "G2x4y5");
    check_base_class_offset(lv, (E2x4*), ABISELECT(16,12), "G2x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x4y5.ff");
    test_class_info(&lv, &cd_G2x4y5);
    dp->~G2x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y5(Test_G2x4y5, "G2x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x4y5C1Ev();
extern void _ZN6G2x4y5D1Ev();
Name_Map name_map_G2x4y5[] = {
  NSPAIR(_ZN6G2x4y5C1Ev),
  NSPAIR(_ZN6G2x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y5[];
static  VTBL_ENTRY vtc_G2x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y5[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x4y5[0]),
};
extern VTBL_ENTRY _ZTV6G2x4y5[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y5[] = {
  {&(_ZTV6G2x4y5[4]),  4,7},
  {&(_ZTV6G2x4y5[7]),  7,7},
  {&(_tg__ZTV4E2x4__6G2x4y5[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y5[];
extern  VTBL_ENTRY _ZTV6G2x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y5[];
Class_Descriptor cd_G2x4y5 = {  "G2x4y5", // class name
  bases_G2x4y5, 6,
  &(vtc_G2x4y5[0]), // expected_vtbl_contents
  &(vtt_G2x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y5),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y6  : E2x4 , virtual F0 {
  int ff;
  ~G2x4y6(); // tgen
  G2x4y6(); // tgen
};
//SIG(1 G2x4y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x4y6 ::~G2x4y6(){ note_dtor("G2x4y6", this);} // tgen
G2x4y6 ::G2x4y6(){ note_ctor("G2x4y6", this);} // tgen

static void Test_G2x4y6()
{
  extern Class_Descriptor cd_G2x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x4y6, buf);
    G2x4y6 *dp, &lv = *(dp=new (buf) G2x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y6)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(28,24), "G2x4y6");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(8,4), "G2x4y6");
    check_base_class_offset(lv, (C2*)(E2x4*), 0, "G2x4y6");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(16,12), "G2x4y6");
    check_base_class_offset(lv, (E2x4*), 0, "G2x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G2x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G2x4y6.ff");
    test_class_info(&lv, &cd_G2x4y6);
    dp->~G2x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y6(Test_G2x4y6, "G2x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G2x4y6C1Ev();
extern void _ZN6G2x4y6D1Ev();
Name_Map name_map_G2x4y6[] = {
  NSPAIR(_ZN6G2x4y6C1Ev),
  NSPAIR(_ZN6G2x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y6[];
static  VTBL_ENTRY vtc_G2x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y6[0]),
};
extern VTBL_ENTRY _ZTV6G2x4y6[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y6[] = {
  {&(_ZTV6G2x4y6[4]),  4,4},
  {&(_tg__ZTV4E2x4__6G2x4y6[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y6[];
extern  VTBL_ENTRY _ZTV6G2x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y6[];
Class_Descriptor cd_G2x4y6 = {  "G2x4y6", // class name
  bases_G2x4y6, 6,
  &(vtc_G2x4y6[0]), // expected_vtbl_contents
  &(vtt_G2x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G2x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y6),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x4y7  : virtual E2x4 , virtual F0 {
  int ff;
  ~G2x4y7(); // tgen
  G2x4y7(); // tgen
};
//SIG(1 G2x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x4y7 ::~G2x4y7(){ note_dtor("G2x4y7", this);} // tgen
G2x4y7 ::G2x4y7(){ note_ctor("G2x4y7", this);} // tgen

static void Test_G2x4y7()
{
  extern Class_Descriptor cd_G2x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x4y7, buf);
    G2x4y7 *dp, &lv = *(dp=new (buf) G2x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x4y7)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x4*), ABISELECT(40,28), "G2x4y7");
    check_base_class_offset(lv, (B0*)(C2*)(E2x4*), ABISELECT(24,12), "G2x4y7");
    check_base_class_offset(lv, (C2*)(E2x4*), ABISELECT(16,8), "G2x4y7");
    check_base_class_offset(lv, (D0*)(E2x4*), ABISELECT(32,20), "G2x4y7");
    check_base_class_offset(lv, (E2x4*), ABISELECT(16,8), "G2x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G2x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x4y7.ff");
    test_class_info(&lv, &cd_G2x4y7);
    dp->~G2x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x4y7(Test_G2x4y7, "G2x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x4y7C1Ev();
extern void _ZN6G2x4y7D1Ev();
Name_Map name_map_G2x4y7[] = {
  NSPAIR(_ZN6G2x4y7C1Ev),
  NSPAIR(_ZN6G2x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x4;
extern VTBL_ENTRY _ZTI4E2x4[];
extern  VTBL_ENTRY _ZTV4E2x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x4y7[];
static  VTBL_ENTRY vtc_G2x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x4y7[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x4y7[0]),
};
extern VTBL_ENTRY _ZTV6G2x4y7[];
static  VTBL_ENTRY _tg__ZTV4E2x4__6G2x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x4__6G2x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x4y7[] = {
  {&(_ZTV6G2x4y7[5]),  5,8},
  {&(_ZTV6G2x4y7[8]),  8,8},
  {&(_tg__ZTV4E2x4__6G2x4y7[3]),  3,3},
  {&(_tg__ZTV2C24E2x4__6G2x4y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x4y7[];
extern  VTBL_ENTRY _ZTV6G2x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x4y7[];
Class_Descriptor cd_G2x4y7 = {  "G2x4y7", // class name
  bases_G2x4y7, 6,
  &(vtc_G2x4y7[0]), // expected_vtbl_contents
  &(vtt_G2x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x4y7),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x4y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E3x4  : C3 , D0 {
  int fd;
  ~E3x4(); // tgen
  E3x4(); // tgen
};
//SIG(-1 E3x4) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E3x4 ::~E3x4(){ note_dtor("E3x4", this);} // tgen
E3x4 ::E3x4(){ note_ctor("E3x4", this);} // tgen

static void Test_E3x4()
{
  extern Class_Descriptor cd_E3x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E3x4, buf);
    E3x4 *dp, &lv = *(dp=new (buf) E3x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E3x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x4)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(24,20), "E3x4");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(8,4), "E3x4");
    check_base_class_offset(lv, (C3*), 0, "E3x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E3x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E3x4.fd");
    test_class_info(&lv, &cd_E3x4);
    dp->~E3x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x4(Test_E3x4, "E3x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E3x4C1Ev();
extern void _ZN4E3x4D1Ev();
Name_Map name_map_E3x4[] = {
  NSPAIR(_ZN4E3x4C1Ev),
  NSPAIR(_ZN4E3x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E3x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E3x4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E3x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E3x4[];
static  VTBL_ENTRY _tg__ZTV2C3__4E3x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__4E3x4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x4[] = {
  {&(_ZTV4E3x4[3]),  3,7},
  {&(_tg__ZTV2C3__4E3x4[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__4E3x4[3]),  3,4},
  {&(_ZTV4E3x4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
Class_Descriptor cd_E3x4 = {  "E3x4", // class name
  bases_E3x4, 4,
  &(vtc_E3x4[0]), // expected_vtbl_contents
  &(vtt_E3x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E3x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E3x4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E3x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y0  : E3x4 , F1 {
  int ff;
  ~G3x4y0(); // tgen
  G3x4y0(); // tgen
};
//SIG(1 G3x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x4y0 ::~G3x4y0(){ note_dtor("G3x4y0", this);} // tgen
G3x4y0 ::G3x4y0(){ note_ctor("G3x4y0", this);} // tgen

static void Test_G3x4y0()
{
  extern Class_Descriptor cd_G3x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x4y0, buf);
    G3x4y0 *dp, &lv = *(dp=new (buf) G3x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y0)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(40,32), "G3x4y0");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(8,4), "G3x4y0");
    check_base_class_offset(lv, (C3*)(E3x4*), 0, "G3x4y0");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(16,12), "G3x4y0");
    check_base_class_offset(lv, (E3x4*), 0, "G3x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G3x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G3x4y0.ff");
    test_class_info(&lv, &cd_G3x4y0);
    dp->~G3x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y0(Test_G3x4y0, "G3x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x4y0C1Ev();
extern void _ZN6G3x4y0D1Ev();
Name_Map name_map_G3x4y0[] = {
  NSPAIR(_ZN6G3x4y0C1Ev),
  NSPAIR(_ZN6G3x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y0[0]),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G3x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G3x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y0[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y0[] = {
  {&(_ZTV6G3x4y0[3]),  3,10},
  {&(_tg__ZTV4E3x4__6G3x4y0[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y0[3]),  3,4},
  {&(_ZTV6G3x4y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G3x4y0[];
extern  VTBL_ENTRY _ZTV6G3x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y0[];
Class_Descriptor cd_G3x4y0 = {  "G3x4y0", // class name
  bases_G3x4y0, 6,
  &(vtc_G3x4y0[0]), // expected_vtbl_contents
  &(vtt_G3x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y1  : virtual E3x4 , F1 {
  int ff;
  ~G3x4y1(); // tgen
  G3x4y1(); // tgen
};
//SIG(1 G3x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x4y1 ::~G3x4y1(){ note_dtor("G3x4y1", this);} // tgen
G3x4y1 ::G3x4y1(){ note_ctor("G3x4y1", this);} // tgen

static void Test_G3x4y1()
{
  extern Class_Descriptor cd_G3x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x4y1, buf);
    G3x4y1 *dp, &lv = *(dp=new (buf) G3x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y1)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(40,32), "G3x4y1");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(24,16), "G3x4y1");
    check_base_class_offset(lv, (C3*)(E3x4*), ABISELECT(16,12), "G3x4y1");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(32,24), "G3x4y1");
    check_base_class_offset(lv, (E3x4*), ABISELECT(16,12), "G3x4y1");
    check_base_class_offset(lv, (F1*), 0, "G3x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x4y1.ff");
    test_class_info(&lv, &cd_G3x4y1);
    dp->~G3x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y1(Test_G3x4y1, "G3x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x4y1C1Ev();
extern void _ZN6G3x4y1D1Ev();
Name_Map name_map_G3x4y1[] = {
  NSPAIR(_ZN6G3x4y1C1Ev),
  NSPAIR(_ZN6G3x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x4y1[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G3x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y1[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y1[] = {
  {&(_ZTV6G3x4y1[4]),  4,12},
  {&(_ZTV6G3x4y1[8]),  8,12},
  {&(_ZTV6G3x4y1[11]),  11,12},
  {&(_tg__ZTV4E3x4__6G3x4y1[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x4y1[];
extern  VTBL_ENTRY _ZTV6G3x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y1[];
Class_Descriptor cd_G3x4y1 = {  "G3x4y1", // class name
  bases_G3x4y1, 6,
  &(vtc_G3x4y1[0]), // expected_vtbl_contents
  &(vtt_G3x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y2  : E3x4 , virtual F1 {
  int ff;
  ~G3x4y2(); // tgen
  G3x4y2(); // tgen
};
//SIG(1 G3x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x4y2 ::~G3x4y2(){ note_dtor("G3x4y2", this);} // tgen
G3x4y2 ::G3x4y2(){ note_ctor("G3x4y2", this);} // tgen

static void Test_G3x4y2()
{
  extern Class_Descriptor cd_G3x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G3x4y2, buf);
    G3x4y2 *dp, &lv = *(dp=new (buf) G3x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G3x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y2)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(32,24), "G3x4y2");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(8,4), "G3x4y2");
    check_base_class_offset(lv, (C3*)(E3x4*), 0, "G3x4y2");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(16,12), "G3x4y2");
    check_base_class_offset(lv, (E3x4*), 0, "G3x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G3x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G3x4y2.ff");
    test_class_info(&lv, &cd_G3x4y2);
    dp->~G3x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y2(Test_G3x4y2, "G3x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G3x4y2C1Ev();
extern void _ZN6G3x4y2D1Ev();
Name_Map name_map_G3x4y2[] = {
  NSPAIR(_ZN6G3x4y2C1Ev),
  NSPAIR(_ZN6G3x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y2[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G3x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y2[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y2[] = {
  {&(_ZTV6G3x4y2[4]),  4,12},
  {&(_tg__ZTV4E3x4__6G3x4y2[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y2[3]),  3,4},
  {&(_ZTV6G3x4y2[7]),  7,12},
  {&(_ZTV6G3x4y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G3x4y2[];
extern  VTBL_ENTRY _ZTV6G3x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y2[];
Class_Descriptor cd_G3x4y2 = {  "G3x4y2", // class name
  bases_G3x4y2, 6,
  &(vtc_G3x4y2[0]), // expected_vtbl_contents
  &(vtt_G3x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G3x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y3  : virtual E3x4 , virtual F1 {
  int ff;
  ~G3x4y3(); // tgen
  G3x4y3(); // tgen
};
//SIG(1 G3x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x4y3 ::~G3x4y3(){ note_dtor("G3x4y3", this);} // tgen
G3x4y3 ::G3x4y3(){ note_ctor("G3x4y3", this);} // tgen

static void Test_G3x4y3()
{
  extern Class_Descriptor cd_G3x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x4y3, buf);
    G3x4y3 *dp, &lv = *(dp=new (buf) G3x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y3)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(40,28), "G3x4y3");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(24,12), "G3x4y3");
    check_base_class_offset(lv, (C3*)(E3x4*), ABISELECT(16,8), "G3x4y3");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(32,20), "G3x4y3");
    check_base_class_offset(lv, (E3x4*), ABISELECT(16,8), "G3x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G3x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x4y3.ff");
    test_class_info(&lv, &cd_G3x4y3);
    dp->~G3x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y3(Test_G3x4y3, "G3x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G3x4y3C1Ev();
extern void _ZN6G3x4y3D1Ev();
Name_Map name_map_G3x4y3[] = {
  NSPAIR(_ZN6G3x4y3C1Ev),
  NSPAIR(_ZN6G3x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y3[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x4y3[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G3x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y3[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y3[] = {
  {&(_ZTV6G3x4y3[5]),  5,16},
  {&(_ZTV6G3x4y3[8]),  8,16},
  {&(_ZTV6G3x4y3[11]),  11,16},
  {&(_ZTV6G3x4y3[15]),  15,16},
  {&(_tg__ZTV4E3x4__6G3x4y3[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x4y3[];
extern  VTBL_ENTRY _ZTV6G3x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y3[];
Class_Descriptor cd_G3x4y3 = {  "G3x4y3", // class name
  bases_G3x4y3, 6,
  &(vtc_G3x4y3[0]), // expected_vtbl_contents
  &(vtt_G3x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G3x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y4  : E3x4 , F0 {
  int ff;
  ~G3x4y4(); // tgen
  G3x4y4(); // tgen
};
//SIG(1 G3x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G3x4y4 ::~G3x4y4(){ note_dtor("G3x4y4", this);} // tgen
G3x4y4 ::G3x4y4(){ note_ctor("G3x4y4", this);} // tgen

static void Test_G3x4y4()
{
  extern Class_Descriptor cd_G3x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x4y4, buf);
    G3x4y4 *dp, &lv = *(dp=new (buf) G3x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y4)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(32,28), "G3x4y4");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(8,4), "G3x4y4");
    check_base_class_offset(lv, (C3*)(E3x4*), 0, "G3x4y4");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(16,12), "G3x4y4");
    check_base_class_offset(lv, (E3x4*), 0, "G3x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G3x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G3x4y4.ff");
    test_class_info(&lv, &cd_G3x4y4);
    dp->~G3x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y4(Test_G3x4y4, "G3x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G3x4y4C1Ev();
extern void _ZN6G3x4y4D1Ev();
Name_Map name_map_G3x4y4[] = {
  NSPAIR(_ZN6G3x4y4C1Ev),
  NSPAIR(_ZN6G3x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,28), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y4[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G3x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y4[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y4[] = {
  {&(_ZTV6G3x4y4[3]),  3,7},
  {&(_tg__ZTV4E3x4__6G3x4y4[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y4[3]),  3,4},
  {&(_ZTV6G3x4y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI6G3x4y4[];
extern  VTBL_ENTRY _ZTV6G3x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y4[];
Class_Descriptor cd_G3x4y4 = {  "G3x4y4", // class name
  bases_G3x4y4, 6,
  &(vtc_G3x4y4[0]), // expected_vtbl_contents
  &(vtt_G3x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G3x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y5  : virtual E3x4 , F0 {
  int ff;
  ~G3x4y5(); // tgen
  G3x4y5(); // tgen
};
//SIG(1 G3x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G3x4y5 ::~G3x4y5(){ note_dtor("G3x4y5", this);} // tgen
G3x4y5 ::G3x4y5(){ note_ctor("G3x4y5", this);} // tgen

static void Test_G3x4y5()
{
  extern Class_Descriptor cd_G3x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x4y5, buf);
    G3x4y5 *dp, &lv = *(dp=new (buf) G3x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y5)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(40,32), "G3x4y5");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(24,16), "G3x4y5");
    check_base_class_offset(lv, (C3*)(E3x4*), ABISELECT(16,12), "G3x4y5");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(32,24), "G3x4y5");
    check_base_class_offset(lv, (E3x4*), ABISELECT(16,12), "G3x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x4y5.ff");
    test_class_info(&lv, &cd_G3x4y5);
    dp->~G3x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y5(Test_G3x4y5, "G3x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x4y5C1Ev();
extern void _ZN6G3x4y5D1Ev();
Name_Map name_map_G3x4y5[] = {
  NSPAIR(_ZN6G3x4y5C1Ev),
  NSPAIR(_ZN6G3x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y5[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x4y5[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G3x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y5[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y5[] = {
  {&(_ZTV6G3x4y5[4]),  4,11},
  {&(_ZTV6G3x4y5[7]),  7,11},
  {&(_ZTV6G3x4y5[10]),  10,11},
  {&(_tg__ZTV4E3x4__6G3x4y5[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x4y5[];
extern  VTBL_ENTRY _ZTV6G3x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y5[];
Class_Descriptor cd_G3x4y5 = {  "G3x4y5", // class name
  bases_G3x4y5, 6,
  &(vtc_G3x4y5[0]), // expected_vtbl_contents
  &(vtt_G3x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y6  : E3x4 , virtual F0 {
  int ff;
  ~G3x4y6(); // tgen
  G3x4y6(); // tgen
};
//SIG(1 G3x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x4y6 ::~G3x4y6(){ note_dtor("G3x4y6", this);} // tgen
G3x4y6 ::G3x4y6(){ note_ctor("G3x4y6", this);} // tgen

static void Test_G3x4y6()
{
  extern Class_Descriptor cd_G3x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x4y6, buf);
    G3x4y6 *dp, &lv = *(dp=new (buf) G3x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y6)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(32,24), "G3x4y6");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(8,4), "G3x4y6");
    check_base_class_offset(lv, (C3*)(E3x4*), 0, "G3x4y6");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(16,12), "G3x4y6");
    check_base_class_offset(lv, (E3x4*), 0, "G3x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G3x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G3x4y6.ff");
    test_class_info(&lv, &cd_G3x4y6);
    dp->~G3x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y6(Test_G3x4y6, "G3x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G3x4y6C1Ev();
extern void _ZN6G3x4y6D1Ev();
Name_Map name_map_G3x4y6[] = {
  NSPAIR(_ZN6G3x4y6C1Ev),
  NSPAIR(_ZN6G3x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y6[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y6[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y6[] = {
  {&(_ZTV6G3x4y6[4]),  4,8},
  {&(_tg__ZTV4E3x4__6G3x4y6[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y6[3]),  3,4},
  {&(_ZTV6G3x4y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G3x4y6[];
extern  VTBL_ENTRY _ZTV6G3x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y6[];
Class_Descriptor cd_G3x4y6 = {  "G3x4y6", // class name
  bases_G3x4y6, 6,
  &(vtc_G3x4y6[0]), // expected_vtbl_contents
  &(vtt_G3x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G3x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x4y7  : virtual E3x4 , virtual F0 {
  int ff;
  ~G3x4y7(); // tgen
  G3x4y7(); // tgen
};
//SIG(1 G3x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x4y7 ::~G3x4y7(){ note_dtor("G3x4y7", this);} // tgen
G3x4y7 ::G3x4y7(){ note_ctor("G3x4y7", this);} // tgen

static void Test_G3x4y7()
{
  extern Class_Descriptor cd_G3x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x4y7, buf);
    G3x4y7 *dp, &lv = *(dp=new (buf) G3x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x4y7)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x4*), ABISELECT(40,28), "G3x4y7");
    check_base_class_offset(lv, (B0*)(C3*)(E3x4*), ABISELECT(24,12), "G3x4y7");
    check_base_class_offset(lv, (C3*)(E3x4*), ABISELECT(16,8), "G3x4y7");
    check_base_class_offset(lv, (D0*)(E3x4*), ABISELECT(32,20), "G3x4y7");
    check_base_class_offset(lv, (E3x4*), ABISELECT(16,8), "G3x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G3x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x4y7.ff");
    test_class_info(&lv, &cd_G3x4y7);
    dp->~G3x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x4y7(Test_G3x4y7, "G3x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x4y7C1Ev();
extern void _ZN6G3x4y7D1Ev();
Name_Map name_map_G3x4y7[] = {
  NSPAIR(_ZN6G3x4y7C1Ev),
  NSPAIR(_ZN6G3x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x4;
extern VTBL_ENTRY _ZTI4E3x4[];
extern  VTBL_ENTRY _ZTV4E3x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x4y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x4y7[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x4y7[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x4y7[];
static  VTBL_ENTRY _tg__ZTV4E3x4__6G3x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x4__6G3x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x4__6G3x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x4__6G3x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x4y7[] = {
  {&(_ZTV6G3x4y7[5]),  5,12},
  {&(_ZTV6G3x4y7[8]),  8,12},
  {&(_ZTV6G3x4y7[11]),  11,12},
  {&(_tg__ZTV4E3x4__6G3x4y7[3]),  3,3},
  {&(_tg__ZTV2C34E3x4__6G3x4y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x4__6G3x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x4__6G3x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x4y7[];
extern  VTBL_ENTRY _ZTV6G3x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x4y7[];
Class_Descriptor cd_G3x4y7 = {  "G3x4y7", // class name
  bases_G3x4y7, 6,
  &(vtc_G3x4y7[0]), // expected_vtbl_contents
  &(vtt_G3x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x4y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x4  : C4 , D0 {
  int fd;
  ~E4x4(); // tgen
  E4x4(); // tgen
};
//SIG(-1 E4x4) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E4x4 ::~E4x4(){ note_dtor("E4x4", this);} // tgen
E4x4 ::E4x4(){ note_ctor("E4x4", this);} // tgen

static void Test_E4x4()
{
  extern Class_Descriptor cd_E4x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E4x4, buf);
    E4x4 *dp, &lv = *(dp=new (buf) E4x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E4x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x4)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(12,8), "E4x4");
    check_base_class_offset(lv, (B1*)(C4*), 0, "E4x4");
    check_base_class_offset(lv, (C4*), 0, "E4x4");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E4x4");
    check_field_offset(lv, fd, ABISELECT(24,20), "E4x4.fd");
    test_class_info(&lv, &cd_E4x4);
    dp->~E4x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x4(Test_E4x4, "E4x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E4x4C1Ev();
extern void _ZN4E4x4D1Ev();
Name_Map name_map_E4x4[] = {
  NSPAIR(_ZN4E4x4C1Ev),
  NSPAIR(_ZN4E4x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E4x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E4x4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E4x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI4E4x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
Class_Descriptor cd_E4x4 = {  "E4x4", // class name
  bases_E4x4, 4,
  &(vtc_E4x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E4x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E4x4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y0  : E4x4 , F1 {
  int ff;
  ~G4x4y0(); // tgen
  G4x4y0(); // tgen
};
//SIG(1 G4x4y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x4y0 ::~G4x4y0(){ note_dtor("G4x4y0", this);} // tgen
G4x4y0 ::G4x4y0(){ note_ctor("G4x4y0", this);} // tgen

static void Test_G4x4y0()
{
  extern Class_Descriptor cd_G4x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x4y0, buf);
    G4x4y0 *dp, &lv = *(dp=new (buf) G4x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y0)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(12,8), "G4x4y0");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), 0, "G4x4y0");
    check_base_class_offset(lv, (C4*)(E4x4*), 0, "G4x4y0");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(20,16), "G4x4y0");
    check_base_class_offset(lv, (E4x4*), 0, "G4x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G4x4y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G4x4y0.ff");
    test_class_info(&lv, &cd_G4x4y0);
    dp->~G4x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y0(Test_G4x4y0, "G4x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x4y0C1Ev();
extern void _ZN6G4x4y0D1Ev();
Name_Map name_map_G4x4y0[] = {
  NSPAIR(_ZN6G4x4y0C1Ev),
  NSPAIR(_ZN6G4x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,24), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y0[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G4x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI6G4x4y0[];
extern  VTBL_ENTRY _ZTV6G4x4y0[];
Class_Descriptor cd_G4x4y0 = {  "G4x4y0", // class name
  bases_G4x4y0, 6,
  &(vtc_G4x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y0),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y1  : virtual E4x4 , F1 {
  int ff;
  ~G4x4y1(); // tgen
  G4x4y1(); // tgen
};
//SIG(1 G4x4y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x4y1 ::~G4x4y1(){ note_dtor("G4x4y1", this);} // tgen
G4x4y1 ::G4x4y1(){ note_ctor("G4x4y1", this);} // tgen

static void Test_G4x4y1()
{
  extern Class_Descriptor cd_G4x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x4y1, buf);
    G4x4y1 *dp, &lv = *(dp=new (buf) G4x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y1)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(28,20), "G4x4y1");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), ABISELECT(16,12), "G4x4y1");
    check_base_class_offset(lv, (C4*)(E4x4*), ABISELECT(16,12), "G4x4y1");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(36,28), "G4x4y1");
    check_base_class_offset(lv, (E4x4*), ABISELECT(16,12), "G4x4y1");
    check_base_class_offset(lv, (F1*), 0, "G4x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x4y1.ff");
    test_class_info(&lv, &cd_G4x4y1);
    dp->~G4x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y1(Test_G4x4y1, "G4x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x4y1C1Ev();
extern void _ZN6G4x4y1D1Ev();
Name_Map name_map_G4x4y1[] = {
  NSPAIR(_ZN6G4x4y1C1Ev),
  NSPAIR(_ZN6G4x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x4y1[];
static  VTT_ENTRY vtt_G4x4y1[] = {
  {&(_ZTV6G4x4y1[3]),  3,8},
  {&(_ZTV6G4x4y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G4x4y1[];
extern  VTBL_ENTRY _ZTV6G4x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x4y1[];
Class_Descriptor cd_G4x4y1 = {  "G4x4y1", // class name
  bases_G4x4y1, 6,
  &(vtc_G4x4y1[0]), // expected_vtbl_contents
  &(vtt_G4x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x4y1),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y2  : E4x4 , virtual F1 {
  int ff;
  ~G4x4y2(); // tgen
  G4x4y2(); // tgen
};
//SIG(1 G4x4y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x4y2 ::~G4x4y2(){ note_dtor("G4x4y2", this);} // tgen
G4x4y2 ::G4x4y2(){ note_ctor("G4x4y2", this);} // tgen

static void Test_G4x4y2()
{
  extern Class_Descriptor cd_G4x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x4y2, buf);
    G4x4y2 *dp, &lv = *(dp=new (buf) G4x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y2)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(12,8), "G4x4y2");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), 0, "G4x4y2");
    check_base_class_offset(lv, (C4*)(E4x4*), 0, "G4x4y2");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(20,16), "G4x4y2");
    check_base_class_offset(lv, (E4x4*), 0, "G4x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G4x4y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G4x4y2.ff");
    test_class_info(&lv, &cd_G4x4y2);
    dp->~G4x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y2(Test_G4x4y2, "G4x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x4y2C1Ev();
extern void _ZN6G4x4y2D1Ev();
Name_Map name_map_G4x4y2[] = {
  NSPAIR(_ZN6G4x4y2C1Ev),
  NSPAIR(_ZN6G4x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x4y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G4x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x4y2[];
static  VTT_ENTRY vtt_G4x4y2[] = {
  {&(_ZTV6G4x4y2[3]),  3,8},
  {&(_ZTV6G4x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G4x4y2[];
extern  VTBL_ENTRY _ZTV6G4x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x4y2[];
Class_Descriptor cd_G4x4y2 = {  "G4x4y2", // class name
  bases_G4x4y2, 6,
  &(vtc_G4x4y2[0]), // expected_vtbl_contents
  &(vtt_G4x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x4y2),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y3  : virtual E4x4 , virtual F1 {
  int ff;
  ~G4x4y3(); // tgen
  G4x4y3(); // tgen
};
//SIG(1 G4x4y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x4y3 ::~G4x4y3(){ note_dtor("G4x4y3", this);} // tgen
G4x4y3 ::G4x4y3(){ note_ctor("G4x4y3", this);} // tgen

static void Test_G4x4y3()
{
  extern Class_Descriptor cd_G4x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x4y3, buf);
    G4x4y3 *dp, &lv = *(dp=new (buf) G4x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y3)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(28,16), "G4x4y3");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), ABISELECT(16,8), "G4x4y3");
    check_base_class_offset(lv, (C4*)(E4x4*), ABISELECT(16,8), "G4x4y3");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(36,24), "G4x4y3");
    check_base_class_offset(lv, (E4x4*), ABISELECT(16,8), "G4x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G4x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x4y3.ff");
    test_class_info(&lv, &cd_G4x4y3);
    dp->~G4x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y3(Test_G4x4y3, "G4x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G4x4y3C1Ev();
extern void _ZN6G4x4y3D1Ev();
Name_Map name_map_G4x4y3[] = {
  NSPAIR(_ZN6G4x4y3C1Ev),
  NSPAIR(_ZN6G4x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G4x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x4y3[];
static  VTT_ENTRY vtt_G4x4y3[] = {
  {&(_ZTV6G4x4y3[4]),  4,12},
  {&(_ZTV6G4x4y3[7]),  7,12},
  {&(_ZTV6G4x4y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G4x4y3[];
extern  VTBL_ENTRY _ZTV6G4x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x4y3[];
Class_Descriptor cd_G4x4y3 = {  "G4x4y3", // class name
  bases_G4x4y3, 6,
  &(vtc_G4x4y3[0]), // expected_vtbl_contents
  &(vtt_G4x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G4x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x4y3),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y4  : E4x4 , F0 {
  int ff;
  ~G4x4y4(); // tgen
  G4x4y4(); // tgen
};
//SIG(1 G4x4y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G4x4y4 ::~G4x4y4(){ note_dtor("G4x4y4", this);} // tgen
G4x4y4 ::G4x4y4(){ note_ctor("G4x4y4", this);} // tgen

static void Test_G4x4y4()
{
  extern Class_Descriptor cd_G4x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x4y4, buf);
    G4x4y4 *dp, &lv = *(dp=new (buf) G4x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y4)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(12,8), "G4x4y4");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), 0, "G4x4y4");
    check_base_class_offset(lv, (C4*)(E4x4*), 0, "G4x4y4");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(20,16), "G4x4y4");
    check_base_class_offset(lv, (E4x4*), 0, "G4x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G4x4y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G4x4y4.ff");
    test_class_info(&lv, &cd_G4x4y4);
    dp->~G4x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y4(Test_G4x4y4, "G4x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G4x4y4C1Ev();
extern void _ZN6G4x4y4D1Ev();
Name_Map name_map_G4x4y4[] = {
  NSPAIR(_ZN6G4x4y4C1Ev),
  NSPAIR(_ZN6G4x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI6G4x4y4[];
extern  VTBL_ENTRY _ZTV6G4x4y4[];
Class_Descriptor cd_G4x4y4 = {  "G4x4y4", // class name
  bases_G4x4y4, 6,
  &(vtc_G4x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G4x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y5  : virtual E4x4 , F0 {
  int ff;
  ~G4x4y5(); // tgen
  G4x4y5(); // tgen
};
//SIG(1 G4x4y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G4x4y5 ::~G4x4y5(){ note_dtor("G4x4y5", this);} // tgen
G4x4y5 ::G4x4y5(){ note_ctor("G4x4y5", this);} // tgen

static void Test_G4x4y5()
{
  extern Class_Descriptor cd_G4x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x4y5, buf);
    G4x4y5 *dp, &lv = *(dp=new (buf) G4x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y5)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(28,20), "G4x4y5");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), ABISELECT(16,12), "G4x4y5");
    check_base_class_offset(lv, (C4*)(E4x4*), ABISELECT(16,12), "G4x4y5");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(36,28), "G4x4y5");
    check_base_class_offset(lv, (E4x4*), ABISELECT(16,12), "G4x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x4y5.ff");
    test_class_info(&lv, &cd_G4x4y5);
    dp->~G4x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y5(Test_G4x4y5, "G4x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x4y5C1Ev();
extern void _ZN6G4x4y5D1Ev();
Name_Map name_map_G4x4y5[] = {
  NSPAIR(_ZN6G4x4y5C1Ev),
  NSPAIR(_ZN6G4x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x4y5[];
static  VTT_ENTRY vtt_G4x4y5[] = {
  {&(_ZTV6G4x4y5[3]),  3,7},
  {&(_ZTV6G4x4y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI6G4x4y5[];
extern  VTBL_ENTRY _ZTV6G4x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x4y5[];
Class_Descriptor cd_G4x4y5 = {  "G4x4y5", // class name
  bases_G4x4y5, 6,
  &(vtc_G4x4y5[0]), // expected_vtbl_contents
  &(vtt_G4x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x4y5),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y6  : E4x4 , virtual F0 {
  int ff;
  ~G4x4y6(); // tgen
  G4x4y6(); // tgen
};
//SIG(1 G4x4y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x4y6 ::~G4x4y6(){ note_dtor("G4x4y6", this);} // tgen
G4x4y6 ::G4x4y6(){ note_ctor("G4x4y6", this);} // tgen

static void Test_G4x4y6()
{
  extern Class_Descriptor cd_G4x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x4y6, buf);
    G4x4y6 *dp, &lv = *(dp=new (buf) G4x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y6)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(12,8), "G4x4y6");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), 0, "G4x4y6");
    check_base_class_offset(lv, (C4*)(E4x4*), 0, "G4x4y6");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(20,16), "G4x4y6");
    check_base_class_offset(lv, (E4x4*), 0, "G4x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G4x4y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G4x4y6.ff");
    test_class_info(&lv, &cd_G4x4y6);
    dp->~G4x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y6(Test_G4x4y6, "G4x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G4x4y6C1Ev();
extern void _ZN6G4x4y6D1Ev();
Name_Map name_map_G4x4y6[] = {
  NSPAIR(_ZN6G4x4y6C1Ev),
  NSPAIR(_ZN6G4x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x4y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x4y6[];
static  VTT_ENTRY vtt_G4x4y6[] = {
  {&(_ZTV6G4x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x4y6[];
extern  VTBL_ENTRY _ZTV6G4x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x4y6[];
Class_Descriptor cd_G4x4y6 = {  "G4x4y6", // class name
  bases_G4x4y6, 6,
  &(vtc_G4x4y6[0]), // expected_vtbl_contents
  &(vtt_G4x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G4x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x4y6),1, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x4y7  : virtual E4x4 , virtual F0 {
  int ff;
  ~G4x4y7(); // tgen
  G4x4y7(); // tgen
};
//SIG(1 G4x4y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x4y7 ::~G4x4y7(){ note_dtor("G4x4y7", this);} // tgen
G4x4y7 ::G4x4y7(){ note_ctor("G4x4y7", this);} // tgen

static void Test_G4x4y7()
{
  extern Class_Descriptor cd_G4x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x4y7, buf);
    G4x4y7 *dp, &lv = *(dp=new (buf) G4x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x4y7)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x4*), ABISELECT(28,16), "G4x4y7");
    check_base_class_offset(lv, (B1*)(C4*)(E4x4*), ABISELECT(16,8), "G4x4y7");
    check_base_class_offset(lv, (C4*)(E4x4*), ABISELECT(16,8), "G4x4y7");
    check_base_class_offset(lv, (D0*)(E4x4*), ABISELECT(36,24), "G4x4y7");
    check_base_class_offset(lv, (E4x4*), ABISELECT(16,8), "G4x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G4x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x4y7.ff");
    test_class_info(&lv, &cd_G4x4y7);
    dp->~G4x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x4y7(Test_G4x4y7, "G4x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x4y7C1Ev();
extern void _ZN6G4x4y7D1Ev();
Name_Map name_map_G4x4y7[] = {
  NSPAIR(_ZN6G4x4y7C1Ev),
  NSPAIR(_ZN6G4x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x4;
extern VTBL_ENTRY _ZTI4E4x4[];
extern  VTBL_ENTRY _ZTV4E4x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x4y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x4y7[];
static  VTT_ENTRY vtt_G4x4y7[] = {
  {&(_ZTV6G4x4y7[4]),  4,8},
  {&(_ZTV6G4x4y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G4x4y7[];
extern  VTBL_ENTRY _ZTV6G4x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x4y7[];
Class_Descriptor cd_G4x4y7 = {  "G4x4y7", // class name
  bases_G4x4y7, 6,
  &(vtc_G4x4y7[0]), // expected_vtbl_contents
  &(vtt_G4x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x4y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x4y7),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E5x4  : C5 , D0 {
  int fd;
  ~E5x4(); // tgen
  E5x4(); // tgen
};
//SIG(-1 E5x4) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E5x4 ::~E5x4(){ note_dtor("E5x4", this);} // tgen
E5x4 ::E5x4(){ note_ctor("E5x4", this);} // tgen

static void Test_E5x4()
{
  extern Class_Descriptor cd_E5x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E5x4, buf);
    E5x4 *dp, &lv = *(dp=new (buf) E5x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E5x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x4)");
    check_base_class_offset(lv, (A1*)(C5*), 0, "E5x4");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(16,8), "E5x4");
    check_base_class_offset(lv, (C5*), 0, "E5x4");
    check_base_class_offset(lv, (D0*), ABISELECT(32,20), "E5x4");
    check_field_offset(lv, fd, ABISELECT(36,24), "E5x4.fd");
    test_class_info(&lv, &cd_E5x4);
    dp->~E5x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x4(Test_E5x4, "E5x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E5x4C1Ev();
extern void _ZN4E5x4D1Ev();
Name_Map name_map_E5x4[] = {
  NSPAIR(_ZN4E5x4C1Ev),
  NSPAIR(_ZN4E5x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E5x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E5x4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E5x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI4E5x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
Class_Descriptor cd_E5x4 = {  "E5x4", // class name
  bases_E5x4, 4,
  &(vtc_E5x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E5x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E5x4),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y0  : E5x4 , F1 {
  int ff;
  ~G5x4y0(); // tgen
  G5x4y0(); // tgen
};
//SIG(1 G5x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x4y0 ::~G5x4y0(){ note_dtor("G5x4y0", this);} // tgen
G5x4y0 ::G5x4y0(){ note_ctor("G5x4y0", this);} // tgen

static void Test_G5x4y0()
{
  extern Class_Descriptor cd_G5x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x4y0, buf);
    G5x4y0 *dp, &lv = *(dp=new (buf) G5x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y0)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), 0, "G5x4y0");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(16,8), "G5x4y0");
    check_base_class_offset(lv, (C5*)(E5x4*), 0, "G5x4y0");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(32,20), "G5x4y0");
    check_base_class_offset(lv, (E5x4*), 0, "G5x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,28), "G5x4y0");
    check_field_offset(lv, ff, ABISELECT(52,36), "G5x4y0.ff");
    test_class_info(&lv, &cd_G5x4y0);
    dp->~G5x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y0(Test_G5x4y0, "G5x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x4y0C1Ev();
extern void _ZN6G5x4y0D1Ev();
Name_Map name_map_G5x4y0[] = {
  NSPAIR(_ZN6G5x4y0C1Ev),
  NSPAIR(_ZN6G5x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y0[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G5x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI6G5x4y0[];
extern  VTBL_ENTRY _ZTV6G5x4y0[];
Class_Descriptor cd_G5x4y0 = {  "G5x4y0", // class name
  bases_G5x4y0, 6,
  &(vtc_G5x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y0),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  5, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y1  : virtual E5x4 , F1 {
  int ff;
  ~G5x4y1(); // tgen
  G5x4y1(); // tgen
};
//SIG(1 G5x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x4y1 ::~G5x4y1(){ note_dtor("G5x4y1", this);} // tgen
G5x4y1 ::G5x4y1(){ note_ctor("G5x4y1", this);} // tgen

static void Test_G5x4y1()
{
  extern Class_Descriptor cd_G5x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x4y1, buf);
    G5x4y1 *dp, &lv = *(dp=new (buf) G5x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y1)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), ABISELECT(16,12), "G5x4y1");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(32,20), "G5x4y1");
    check_base_class_offset(lv, (C5*)(E5x4*), ABISELECT(16,12), "G5x4y1");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(48,32), "G5x4y1");
    check_base_class_offset(lv, (E5x4*), ABISELECT(16,12), "G5x4y1");
    check_base_class_offset(lv, (F1*), 0, "G5x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x4y1.ff");
    test_class_info(&lv, &cd_G5x4y1);
    dp->~G5x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y1(Test_G5x4y1, "G5x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x4y1C1Ev();
extern void _ZN6G5x4y1D1Ev();
Name_Map name_map_G5x4y1[] = {
  NSPAIR(_ZN6G5x4y1C1Ev),
  NSPAIR(_ZN6G5x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x4y1[];
static  VTT_ENTRY vtt_G5x4y1[] = {
  {&(_ZTV6G5x4y1[3]),  3,11},
  {&(_ZTV6G5x4y1[7]),  7,11},
  {&(_ZTV6G5x4y1[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G5x4y1[];
extern  VTBL_ENTRY _ZTV6G5x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x4y1[];
Class_Descriptor cd_G5x4y1 = {  "G5x4y1", // class name
  bases_G5x4y1, 6,
  &(vtc_G5x4y1[0]), // expected_vtbl_contents
  &(vtt_G5x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y1),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x4y1),3, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y2  : E5x4 , virtual F1 {
  int ff;
  ~G5x4y2(); // tgen
  G5x4y2(); // tgen
};
//SIG(1 G5x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x4y2 ::~G5x4y2(){ note_dtor("G5x4y2", this);} // tgen
G5x4y2 ::G5x4y2(){ note_ctor("G5x4y2", this);} // tgen

static void Test_G5x4y2()
{
  extern Class_Descriptor cd_G5x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x4y2, buf);
    G5x4y2 *dp, &lv = *(dp=new (buf) G5x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y2)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), 0, "G5x4y2");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(16,8), "G5x4y2");
    check_base_class_offset(lv, (C5*)(E5x4*), 0, "G5x4y2");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(32,20), "G5x4y2");
    check_base_class_offset(lv, (E5x4*), 0, "G5x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G5x4y2");
    check_field_offset(lv, ff, ABISELECT(40,28), "G5x4y2.ff");
    test_class_info(&lv, &cd_G5x4y2);
    dp->~G5x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y2(Test_G5x4y2, "G5x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x4y2C1Ev();
extern void _ZN6G5x4y2D1Ev();
Name_Map name_map_G5x4y2[] = {
  NSPAIR(_ZN6G5x4y2C1Ev),
  NSPAIR(_ZN6G5x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x4y2[] = {
  ABISELECT(48,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G5x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x4y2[];
static  VTT_ENTRY vtt_G5x4y2[] = {
  {&(_ZTV6G5x4y2[3]),  3,11},
  {&(_ZTV6G5x4y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G5x4y2[];
extern  VTBL_ENTRY _ZTV6G5x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x4y2[];
Class_Descriptor cd_G5x4y2 = {  "G5x4y2", // class name
  bases_G5x4y2, 6,
  &(vtc_G5x4y2[0]), // expected_vtbl_contents
  &(vtt_G5x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y2),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x4y2),2, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y3  : virtual E5x4 , virtual F1 {
  int ff;
  ~G5x4y3(); // tgen
  G5x4y3(); // tgen
};
//SIG(1 G5x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x4y3 ::~G5x4y3(){ note_dtor("G5x4y3", this);} // tgen
G5x4y3 ::G5x4y3(){ note_ctor("G5x4y3", this);} // tgen

static void Test_G5x4y3()
{
  extern Class_Descriptor cd_G5x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x4y3, buf);
    G5x4y3 *dp, &lv = *(dp=new (buf) G5x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y3)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), ABISELECT(16,8), "G5x4y3");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(32,16), "G5x4y3");
    check_base_class_offset(lv, (C5*)(E5x4*), ABISELECT(16,8), "G5x4y3");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(48,28), "G5x4y3");
    check_base_class_offset(lv, (E5x4*), ABISELECT(16,8), "G5x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x4y3.ff");
    test_class_info(&lv, &cd_G5x4y3);
    dp->~G5x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y3(Test_G5x4y3, "G5x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x4y3C1Ev();
extern void _ZN6G5x4y3D1Ev();
Name_Map name_map_G5x4y3[] = {
  NSPAIR(_ZN6G5x4y3C1Ev),
  NSPAIR(_ZN6G5x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G5x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G5x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x4y3[];
static  VTT_ENTRY vtt_G5x4y3[] = {
  {&(_ZTV6G5x4y3[4]),  4,15},
  {&(_ZTV6G5x4y3[7]),  7,15},
  {&(_ZTV6G5x4y3[10]),  10,15},
  {&(_ZTV6G5x4y3[14]),  14,15},
};
extern VTBL_ENTRY _ZTI6G5x4y3[];
extern  VTBL_ENTRY _ZTV6G5x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x4y3[];
Class_Descriptor cd_G5x4y3 = {  "G5x4y3", // class name
  bases_G5x4y3, 6,
  &(vtc_G5x4y3[0]), // expected_vtbl_contents
  &(vtt_G5x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y3),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x4y3),4, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y4  : E5x4 , F0 {
  int ff;
  ~G5x4y4(); // tgen
  G5x4y4(); // tgen
};
//SIG(1 G5x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G5x4y4 ::~G5x4y4(){ note_dtor("G5x4y4", this);} // tgen
G5x4y4 ::G5x4y4(){ note_ctor("G5x4y4", this);} // tgen

static void Test_G5x4y4()
{
  extern Class_Descriptor cd_G5x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x4y4, buf);
    G5x4y4 *dp, &lv = *(dp=new (buf) G5x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y4)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), 0, "G5x4y4");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(16,8), "G5x4y4");
    check_base_class_offset(lv, (C5*)(E5x4*), 0, "G5x4y4");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(32,20), "G5x4y4");
    check_base_class_offset(lv, (E5x4*), 0, "G5x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(40,28), "G5x4y4");
    check_field_offset(lv, ff, ABISELECT(44,32), "G5x4y4.ff");
    test_class_info(&lv, &cd_G5x4y4);
    dp->~G5x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y4(Test_G5x4y4, "G5x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G5x4y4C1Ev();
extern void _ZN6G5x4y4D1Ev();
Name_Map name_map_G5x4y4[] = {
  NSPAIR(_ZN6G5x4y4C1Ev),
  NSPAIR(_ZN6G5x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTI6G5x4y4[];
extern  VTBL_ENTRY _ZTV6G5x4y4[];
Class_Descriptor cd_G5x4y4 = {  "G5x4y4", // class name
  bases_G5x4y4, 6,
  &(vtc_G5x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G5x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y4),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y5  : virtual E5x4 , F0 {
  int ff;
  ~G5x4y5(); // tgen
  G5x4y5(); // tgen
};
//SIG(1 G5x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G5x4y5 ::~G5x4y5(){ note_dtor("G5x4y5", this);} // tgen
G5x4y5 ::G5x4y5(){ note_ctor("G5x4y5", this);} // tgen

static void Test_G5x4y5()
{
  extern Class_Descriptor cd_G5x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x4y5, buf);
    G5x4y5 *dp, &lv = *(dp=new (buf) G5x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y5)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), ABISELECT(16,12), "G5x4y5");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(32,20), "G5x4y5");
    check_base_class_offset(lv, (C5*)(E5x4*), ABISELECT(16,12), "G5x4y5");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(48,32), "G5x4y5");
    check_base_class_offset(lv, (E5x4*), ABISELECT(16,12), "G5x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x4y5.ff");
    test_class_info(&lv, &cd_G5x4y5);
    dp->~G5x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y5(Test_G5x4y5, "G5x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x4y5C1Ev();
extern void _ZN6G5x4y5D1Ev();
Name_Map name_map_G5x4y5[] = {
  NSPAIR(_ZN6G5x4y5C1Ev),
  NSPAIR(_ZN6G5x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x4y5[];
static  VTT_ENTRY vtt_G5x4y5[] = {
  {&(_ZTV6G5x4y5[3]),  3,10},
  {&(_ZTV6G5x4y5[6]),  6,10},
  {&(_ZTV6G5x4y5[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G5x4y5[];
extern  VTBL_ENTRY _ZTV6G5x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x4y5[];
Class_Descriptor cd_G5x4y5 = {  "G5x4y5", // class name
  bases_G5x4y5, 6,
  &(vtc_G5x4y5[0]), // expected_vtbl_contents
  &(vtt_G5x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y5),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x4y5),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y6  : E5x4 , virtual F0 {
  int ff;
  ~G5x4y6(); // tgen
  G5x4y6(); // tgen
};
//SIG(1 G5x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x4y6 ::~G5x4y6(){ note_dtor("G5x4y6", this);} // tgen
G5x4y6 ::G5x4y6(){ note_ctor("G5x4y6", this);} // tgen

static void Test_G5x4y6()
{
  extern Class_Descriptor cd_G5x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x4y6, buf);
    G5x4y6 *dp, &lv = *(dp=new (buf) G5x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y6)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), 0, "G5x4y6");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(16,8), "G5x4y6");
    check_base_class_offset(lv, (C5*)(E5x4*), 0, "G5x4y6");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(32,20), "G5x4y6");
    check_base_class_offset(lv, (E5x4*), 0, "G5x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G5x4y6");
    check_field_offset(lv, ff, ABISELECT(40,28), "G5x4y6.ff");
    test_class_info(&lv, &cd_G5x4y6);
    dp->~G5x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y6(Test_G5x4y6, "G5x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G5x4y6C1Ev();
extern void _ZN6G5x4y6D1Ev();
Name_Map name_map_G5x4y6[] = {
  NSPAIR(_ZN6G5x4y6C1Ev),
  NSPAIR(_ZN6G5x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x4y6[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x4y6[];
static  VTT_ENTRY vtt_G5x4y6[] = {
  {&(_ZTV6G5x4y6[3]),  3,7},
};
extern VTBL_ENTRY _ZTI6G5x4y6[];
extern  VTBL_ENTRY _ZTV6G5x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x4y6[];
Class_Descriptor cd_G5x4y6 = {  "G5x4y6", // class name
  bases_G5x4y6, 6,
  &(vtc_G5x4y6[0]), // expected_vtbl_contents
  &(vtt_G5x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G5x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y6),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x4y6),1, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x4y7  : virtual E5x4 , virtual F0 {
  int ff;
  ~G5x4y7(); // tgen
  G5x4y7(); // tgen
};
//SIG(1 G5x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x4y7 ::~G5x4y7(){ note_dtor("G5x4y7", this);} // tgen
G5x4y7 ::G5x4y7(){ note_ctor("G5x4y7", this);} // tgen

static void Test_G5x4y7()
{
  extern Class_Descriptor cd_G5x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x4y7, buf);
    G5x4y7 *dp, &lv = *(dp=new (buf) G5x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x4y7)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x4*), ABISELECT(16,8), "G5x4y7");
    check_base_class_offset(lv, (B1*)(C5*)(E5x4*), ABISELECT(32,16), "G5x4y7");
    check_base_class_offset(lv, (C5*)(E5x4*), ABISELECT(16,8), "G5x4y7");
    check_base_class_offset(lv, (D0*)(E5x4*), ABISELECT(48,28), "G5x4y7");
    check_base_class_offset(lv, (E5x4*), ABISELECT(16,8), "G5x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G5x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x4y7.ff");
    test_class_info(&lv, &cd_G5x4y7);
    dp->~G5x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x4y7(Test_G5x4y7, "G5x4y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x4y7C1Ev();
extern void _ZN6G5x4y7D1Ev();
Name_Map name_map_G5x4y7[] = {
  NSPAIR(_ZN6G5x4y7C1Ev),
  NSPAIR(_ZN6G5x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x4;
extern VTBL_ENTRY _ZTI4E5x4[];
extern  VTBL_ENTRY _ZTV4E5x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x4y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x4y7[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G5x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x4y7[];
static  VTT_ENTRY vtt_G5x4y7[] = {
  {&(_ZTV6G5x4y7[4]),  4,11},
  {&(_ZTV6G5x4y7[7]),  7,11},
  {&(_ZTV6G5x4y7[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G5x4y7[];
extern  VTBL_ENTRY _ZTV6G5x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x4y7[];
Class_Descriptor cd_G5x4y7 = {  "G5x4y7", // class name
  bases_G5x4y7, 6,
  &(vtc_G5x4y7[0]), // expected_vtbl_contents
  &(vtt_G5x4y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x4y7),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x4y7),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E6x4  : C6 , D0 {
  int fd;
  ~E6x4(); // tgen
  E6x4(); // tgen
};
//SIG(-1 E6x4) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E6x4 ::~E6x4(){ note_dtor("E6x4", this);} // tgen
E6x4 ::E6x4(){ note_ctor("E6x4", this);} // tgen

static void Test_E6x4()
{
  extern Class_Descriptor cd_E6x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E6x4, buf);
    E6x4 *dp, &lv = *(dp=new (buf) E6x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E6x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x4)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(24,20), "E6x4");
    check_base_class_offset(lv, (B1*)(C6*), 0, "E6x4");
    check_base_class_offset(lv, (C6*), 0, "E6x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E6x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E6x4.fd");
    test_class_info(&lv, &cd_E6x4);
    dp->~E6x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x4(Test_E6x4, "E6x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E6x4C1Ev();
extern void _ZN4E6x4D1Ev();
Name_Map name_map_E6x4[] = {
  NSPAIR(_ZN4E6x4C1Ev),
  NSPAIR(_ZN4E6x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E6x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E6x4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E6x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E6x4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x4[] = {
  {&(_ZTV4E6x4[3]),  3,4},
  {&(_tg__ZTV2C6__4E6x4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
Class_Descriptor cd_E6x4 = {  "E6x4", // class name
  bases_E6x4, 4,
  &(vtc_E6x4[0]), // expected_vtbl_contents
  &(vtt_E6x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E6x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E6x4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E6x4),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y0  : E6x4 , F1 {
  int ff;
  ~G6x4y0(); // tgen
  G6x4y0(); // tgen
};
//SIG(1 G6x4y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x4y0 ::~G6x4y0(){ note_dtor("G6x4y0", this);} // tgen
G6x4y0 ::G6x4y0(){ note_ctor("G6x4y0", this);} // tgen

static void Test_G6x4y0()
{
  extern Class_Descriptor cd_G6x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x4y0, buf);
    G6x4y0 *dp, &lv = *(dp=new (buf) G6x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y0)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(40,32), "G6x4y0");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), 0, "G6x4y0");
    check_base_class_offset(lv, (C6*)(E6x4*), 0, "G6x4y0");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(16,12), "G6x4y0");
    check_base_class_offset(lv, (E6x4*), 0, "G6x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G6x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G6x4y0.ff");
    test_class_info(&lv, &cd_G6x4y0);
    dp->~G6x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y0(Test_G6x4y0, "G6x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x4y0C1Ev();
extern void _ZN6G6x4y0D1Ev();
Name_Map name_map_G6x4y0[] = {
  NSPAIR(_ZN6G6x4y0C1Ev),
  NSPAIR(_ZN6G6x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y0[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G6x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y0[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y0[] = {
  {&(_ZTV6G6x4y0[3]),  3,7},
  {&(_tg__ZTV4E6x4__6G6x4y0[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y0[];
extern  VTBL_ENTRY _ZTV6G6x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y0[];
Class_Descriptor cd_G6x4y0 = {  "G6x4y0", // class name
  bases_G6x4y0, 6,
  &(vtc_G6x4y0[0]), // expected_vtbl_contents
  &(vtt_G6x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y1  : virtual E6x4 , F1 {
  int ff;
  ~G6x4y1(); // tgen
  G6x4y1(); // tgen
};
//SIG(1 G6x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x4y1 ::~G6x4y1(){ note_dtor("G6x4y1", this);} // tgen
G6x4y1 ::G6x4y1(){ note_ctor("G6x4y1", this);} // tgen

static void Test_G6x4y1()
{
  extern Class_Descriptor cd_G6x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x4y1, buf);
    G6x4y1 *dp, &lv = *(dp=new (buf) G6x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y1)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(40,32), "G6x4y1");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), ABISELECT(16,12), "G6x4y1");
    check_base_class_offset(lv, (C6*)(E6x4*), ABISELECT(16,12), "G6x4y1");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(32,24), "G6x4y1");
    check_base_class_offset(lv, (E6x4*), ABISELECT(16,12), "G6x4y1");
    check_base_class_offset(lv, (F1*), 0, "G6x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x4y1.ff");
    test_class_info(&lv, &cd_G6x4y1);
    dp->~G6x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y1(Test_G6x4y1, "G6x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x4y1C1Ev();
extern void _ZN6G6x4y1D1Ev();
Name_Map name_map_G6x4y1[] = {
  NSPAIR(_ZN6G6x4y1C1Ev),
  NSPAIR(_ZN6G6x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y1[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y1[] = {
  {&(_ZTV6G6x4y1[4]),  4,10},
  {&(_ZTV6G6x4y1[9]),  9,10},
  {&(_tg__ZTV4E6x4__6G6x4y1[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y1[];
extern  VTBL_ENTRY _ZTV6G6x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y1[];
Class_Descriptor cd_G6x4y1 = {  "G6x4y1", // class name
  bases_G6x4y1, 6,
  &(vtc_G6x4y1[0]), // expected_vtbl_contents
  &(vtt_G6x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y2  : E6x4 , virtual F1 {
  int ff;
  ~G6x4y2(); // tgen
  G6x4y2(); // tgen
};
//SIG(1 G6x4y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x4y2 ::~G6x4y2(){ note_dtor("G6x4y2", this);} // tgen
G6x4y2 ::G6x4y2(){ note_ctor("G6x4y2", this);} // tgen

static void Test_G6x4y2()
{
  extern Class_Descriptor cd_G6x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x4y2, buf);
    G6x4y2 *dp, &lv = *(dp=new (buf) G6x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y2)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(28,24), "G6x4y2");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), 0, "G6x4y2");
    check_base_class_offset(lv, (C6*)(E6x4*), 0, "G6x4y2");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(16,12), "G6x4y2");
    check_base_class_offset(lv, (E6x4*), 0, "G6x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G6x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G6x4y2.ff");
    test_class_info(&lv, &cd_G6x4y2);
    dp->~G6x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y2(Test_G6x4y2, "G6x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x4y2C1Ev();
extern void _ZN6G6x4y2D1Ev();
Name_Map name_map_G6x4y2[] = {
  NSPAIR(_ZN6G6x4y2C1Ev),
  NSPAIR(_ZN6G6x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G6x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y2[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y2[] = {
  {&(_ZTV6G6x4y2[4]),  4,9},
  {&(_tg__ZTV4E6x4__6G6x4y2[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y2[3]),  3,4},
  {&(_ZTV6G6x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G6x4y2[];
extern  VTBL_ENTRY _ZTV6G6x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y2[];
Class_Descriptor cd_G6x4y2 = {  "G6x4y2", // class name
  bases_G6x4y2, 6,
  &(vtc_G6x4y2[0]), // expected_vtbl_contents
  &(vtt_G6x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y3  : virtual E6x4 , virtual F1 {
  int ff;
  ~G6x4y3(); // tgen
  G6x4y3(); // tgen
};
//SIG(1 G6x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x4y3 ::~G6x4y3(){ note_dtor("G6x4y3", this);} // tgen
G6x4y3 ::G6x4y3(){ note_ctor("G6x4y3", this);} // tgen

static void Test_G6x4y3()
{
  extern Class_Descriptor cd_G6x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x4y3, buf);
    G6x4y3 *dp, &lv = *(dp=new (buf) G6x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y3)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(40,28), "G6x4y3");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), ABISELECT(16,8), "G6x4y3");
    check_base_class_offset(lv, (C6*)(E6x4*), ABISELECT(16,8), "G6x4y3");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(32,20), "G6x4y3");
    check_base_class_offset(lv, (E6x4*), ABISELECT(16,8), "G6x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G6x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x4y3.ff");
    test_class_info(&lv, &cd_G6x4y3);
    dp->~G6x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y3(Test_G6x4y3, "G6x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G6x4y3C1Ev();
extern void _ZN6G6x4y3D1Ev();
Name_Map name_map_G6x4y3[] = {
  NSPAIR(_ZN6G6x4y3C1Ev),
  NSPAIR(_ZN6G6x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G6x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y3[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y3[] = {
  {&(_ZTV6G6x4y3[5]),  5,14},
  {&(_ZTV6G6x4y3[9]),  9,14},
  {&(_ZTV6G6x4y3[13]),  13,14},
  {&(_tg__ZTV4E6x4__6G6x4y3[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y3[];
extern  VTBL_ENTRY _ZTV6G6x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y3[];
Class_Descriptor cd_G6x4y3 = {  "G6x4y3", // class name
  bases_G6x4y3, 6,
  &(vtc_G6x4y3[0]), // expected_vtbl_contents
  &(vtt_G6x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G6x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y4  : E6x4 , F0 {
  int ff;
  ~G6x4y4(); // tgen
  G6x4y4(); // tgen
};
//SIG(1 G6x4y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G6x4y4 ::~G6x4y4(){ note_dtor("G6x4y4", this);} // tgen
G6x4y4 ::G6x4y4(){ note_ctor("G6x4y4", this);} // tgen

static void Test_G6x4y4()
{
  extern Class_Descriptor cd_G6x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x4y4, buf);
    G6x4y4 *dp, &lv = *(dp=new (buf) G6x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y4)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(32,28), "G6x4y4");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), 0, "G6x4y4");
    check_base_class_offset(lv, (C6*)(E6x4*), 0, "G6x4y4");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(16,12), "G6x4y4");
    check_base_class_offset(lv, (E6x4*), 0, "G6x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G6x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G6x4y4.ff");
    test_class_info(&lv, &cd_G6x4y4);
    dp->~G6x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y4(Test_G6x4y4, "G6x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G6x4y4C1Ev();
extern void _ZN6G6x4y4D1Ev();
Name_Map name_map_G6x4y4[] = {
  NSPAIR(_ZN6G6x4y4C1Ev),
  NSPAIR(_ZN6G6x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y4[] = {
  {&(_ZTV6G6x4y4[3]),  3,4},
  {&(_tg__ZTV4E6x4__6G6x4y4[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y4[];
extern  VTBL_ENTRY _ZTV6G6x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y4[];
Class_Descriptor cd_G6x4y4 = {  "G6x4y4", // class name
  bases_G6x4y4, 6,
  &(vtc_G6x4y4[0]), // expected_vtbl_contents
  &(vtt_G6x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G6x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y5  : virtual E6x4 , F0 {
  int ff;
  ~G6x4y5(); // tgen
  G6x4y5(); // tgen
};
//SIG(1 G6x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G6x4y5 ::~G6x4y5(){ note_dtor("G6x4y5", this);} // tgen
G6x4y5 ::G6x4y5(){ note_ctor("G6x4y5", this);} // tgen

static void Test_G6x4y5()
{
  extern Class_Descriptor cd_G6x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x4y5, buf);
    G6x4y5 *dp, &lv = *(dp=new (buf) G6x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y5)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(40,32), "G6x4y5");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), ABISELECT(16,12), "G6x4y5");
    check_base_class_offset(lv, (C6*)(E6x4*), ABISELECT(16,12), "G6x4y5");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(32,24), "G6x4y5");
    check_base_class_offset(lv, (E6x4*), ABISELECT(16,12), "G6x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x4y5.ff");
    test_class_info(&lv, &cd_G6x4y5);
    dp->~G6x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y5(Test_G6x4y5, "G6x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x4y5C1Ev();
extern void _ZN6G6x4y5D1Ev();
Name_Map name_map_G6x4y5[] = {
  NSPAIR(_ZN6G6x4y5C1Ev),
  NSPAIR(_ZN6G6x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y5[] = {
  {&(_ZTV6G6x4y5[4]),  4,9},
  {&(_ZTV6G6x4y5[8]),  8,9},
  {&(_tg__ZTV4E6x4__6G6x4y5[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y5[];
extern  VTBL_ENTRY _ZTV6G6x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y5[];
Class_Descriptor cd_G6x4y5 = {  "G6x4y5", // class name
  bases_G6x4y5, 6,
  &(vtc_G6x4y5[0]), // expected_vtbl_contents
  &(vtt_G6x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y6  : E6x4 , virtual F0 {
  int ff;
  ~G6x4y6(); // tgen
  G6x4y6(); // tgen
};
//SIG(1 G6x4y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x4y6 ::~G6x4y6(){ note_dtor("G6x4y6", this);} // tgen
G6x4y6 ::G6x4y6(){ note_ctor("G6x4y6", this);} // tgen

static void Test_G6x4y6()
{
  extern Class_Descriptor cd_G6x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x4y6, buf);
    G6x4y6 *dp, &lv = *(dp=new (buf) G6x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y6)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(28,24), "G6x4y6");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), 0, "G6x4y6");
    check_base_class_offset(lv, (C6*)(E6x4*), 0, "G6x4y6");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(16,12), "G6x4y6");
    check_base_class_offset(lv, (E6x4*), 0, "G6x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G6x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G6x4y6.ff");
    test_class_info(&lv, &cd_G6x4y6);
    dp->~G6x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y6(Test_G6x4y6, "G6x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G6x4y6C1Ev();
extern void _ZN6G6x4y6D1Ev();
Name_Map name_map_G6x4y6[] = {
  NSPAIR(_ZN6G6x4y6C1Ev),
  NSPAIR(_ZN6G6x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y6[] = {
  {&(_ZTV6G6x4y6[4]),  4,5},
  {&(_tg__ZTV4E6x4__6G6x4y6[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y6[];
extern  VTBL_ENTRY _ZTV6G6x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y6[];
Class_Descriptor cd_G6x4y6 = {  "G6x4y6", // class name
  bases_G6x4y6, 6,
  &(vtc_G6x4y6[0]), // expected_vtbl_contents
  &(vtt_G6x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G6x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x4y7  : virtual E6x4 , virtual F0 {
  int ff;
  ~G6x4y7(); // tgen
  G6x4y7(); // tgen
};
//SIG(1 G6x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x4y7 ::~G6x4y7(){ note_dtor("G6x4y7", this);} // tgen
G6x4y7 ::G6x4y7(){ note_ctor("G6x4y7", this);} // tgen

static void Test_G6x4y7()
{
  extern Class_Descriptor cd_G6x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x4y7, buf);
    G6x4y7 *dp, &lv = *(dp=new (buf) G6x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x4y7)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x4*), ABISELECT(40,28), "G6x4y7");
    check_base_class_offset(lv, (B1*)(C6*)(E6x4*), ABISELECT(16,8), "G6x4y7");
    check_base_class_offset(lv, (C6*)(E6x4*), ABISELECT(16,8), "G6x4y7");
    check_base_class_offset(lv, (D0*)(E6x4*), ABISELECT(32,20), "G6x4y7");
    check_base_class_offset(lv, (E6x4*), ABISELECT(16,8), "G6x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G6x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x4y7.ff");
    test_class_info(&lv, &cd_G6x4y7);
    dp->~G6x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x4y7(Test_G6x4y7, "G6x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x4y7C1Ev();
extern void _ZN6G6x4y7D1Ev();
Name_Map name_map_G6x4y7[] = {
  NSPAIR(_ZN6G6x4y7C1Ev),
  NSPAIR(_ZN6G6x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x4;
extern VTBL_ENTRY _ZTI4E6x4[];
extern  VTBL_ENTRY _ZTV4E6x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x4y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x4y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x4__6G6x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x4__6G6x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x4y7[] = {
  {&(_ZTV6G6x4y7[5]),  5,10},
  {&(_ZTV6G6x4y7[9]),  9,10},
  {&(_tg__ZTV4E6x4__6G6x4y7[3]),  3,4},
  {&(_tg__ZTV2C64E6x4__6G6x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x4y7[];
extern  VTBL_ENTRY _ZTV6G6x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x4y7[];
Class_Descriptor cd_G6x4y7 = {  "G6x4y7", // class name
  bases_G6x4y7, 6,
  &(vtc_G6x4y7[0]), // expected_vtbl_contents
  &(vtt_G6x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x4y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x4y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E7x4  : C7 , D0 {
  int fd;
  ~E7x4(); // tgen
  E7x4(); // tgen
};
//SIG(-1 E7x4) C1{ BC2{ VBC3{ v1 Fi} BC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E7x4 ::~E7x4(){ note_dtor("E7x4", this);} // tgen
E7x4 ::E7x4(){ note_ctor("E7x4", this);} // tgen

static void Test_E7x4()
{
  extern Class_Descriptor cd_E7x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E7x4, buf);
    E7x4 *dp, &lv = *(dp=new (buf) E7x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E7x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x4)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(24,20), "E7x4");
    check_base_class_offset(lv, (B1*)(C7*), 0, "E7x4");
    check_base_class_offset(lv, (C7*), 0, "E7x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E7x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E7x4.fd");
    test_class_info(&lv, &cd_E7x4);
    dp->~E7x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x4(Test_E7x4, "E7x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E7x4C1Ev();
extern void _ZN4E7x4D1Ev();
Name_Map name_map_E7x4[] = {
  NSPAIR(_ZN4E7x4C1Ev),
  NSPAIR(_ZN4E7x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E7x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E7x4[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E7x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E7x4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__4E7x4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x4[] = {
  {&(_ZTV4E7x4[3]),  3,8},
  {&(_tg__ZTV2C7__4E7x4[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__4E7x4[3]),  3,4},
  {&(_ZTV4E7x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
Class_Descriptor cd_E7x4 = {  "E7x4", // class name
  bases_E7x4, 4,
  &(vtc_E7x4[0]), // expected_vtbl_contents
  &(vtt_E7x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E7x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E7x4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E7x4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y0  : E7x4 , F1 {
  int ff;
  ~G7x4y0(); // tgen
  G7x4y0(); // tgen
};
//SIG(1 G7x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x4y0 ::~G7x4y0(){ note_dtor("G7x4y0", this);} // tgen
G7x4y0 ::G7x4y0(){ note_ctor("G7x4y0", this);} // tgen

static void Test_G7x4y0()
{
  extern Class_Descriptor cd_G7x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x4y0, buf);
    G7x4y0 *dp, &lv = *(dp=new (buf) G7x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y0)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(40,32), "G7x4y0");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), 0, "G7x4y0");
    check_base_class_offset(lv, (C7*)(E7x4*), 0, "G7x4y0");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(16,12), "G7x4y0");
    check_base_class_offset(lv, (E7x4*), 0, "G7x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G7x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G7x4y0.ff");
    test_class_info(&lv, &cd_G7x4y0);
    dp->~G7x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y0(Test_G7x4y0, "G7x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x4y0C1Ev();
extern void _ZN6G7x4y0D1Ev();
Name_Map name_map_G7x4y0[] = {
  NSPAIR(_ZN6G7x4y0C1Ev),
  NSPAIR(_ZN6G7x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y0[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G7x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G7x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y0[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y0[] = {
  {&(_ZTV6G7x4y0[3]),  3,11},
  {&(_tg__ZTV4E7x4__6G7x4y0[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y0[3]),  3,4},
  {&(_ZTV6G7x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G7x4y0[];
extern  VTBL_ENTRY _ZTV6G7x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y0[];
Class_Descriptor cd_G7x4y0 = {  "G7x4y0", // class name
  bases_G7x4y0, 6,
  &(vtc_G7x4y0[0]), // expected_vtbl_contents
  &(vtt_G7x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y1  : virtual E7x4 , F1 {
  int ff;
  ~G7x4y1(); // tgen
  G7x4y1(); // tgen
};
//SIG(1 G7x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x4y1 ::~G7x4y1(){ note_dtor("G7x4y1", this);} // tgen
G7x4y1 ::G7x4y1(){ note_ctor("G7x4y1", this);} // tgen

static void Test_G7x4y1()
{
  extern Class_Descriptor cd_G7x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x4y1, buf);
    G7x4y1 *dp, &lv = *(dp=new (buf) G7x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y1)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(40,32), "G7x4y1");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), ABISELECT(16,12), "G7x4y1");
    check_base_class_offset(lv, (C7*)(E7x4*), ABISELECT(16,12), "G7x4y1");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(32,24), "G7x4y1");
    check_base_class_offset(lv, (E7x4*), ABISELECT(16,12), "G7x4y1");
    check_base_class_offset(lv, (F1*), 0, "G7x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x4y1.ff");
    test_class_info(&lv, &cd_G7x4y1);
    dp->~G7x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y1(Test_G7x4y1, "G7x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x4y1C1Ev();
extern void _ZN6G7x4y1D1Ev();
Name_Map name_map_G7x4y1[] = {
  NSPAIR(_ZN6G7x4y1C1Ev),
  NSPAIR(_ZN6G7x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G7x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y1[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y1[] = {
  {&(_ZTV6G7x4y1[4]),  4,14},
  {&(_ZTV6G7x4y1[9]),  9,14},
  {&(_ZTV6G7x4y1[13]),  13,14},
  {&(_tg__ZTV4E7x4__6G7x4y1[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x4y1[];
extern  VTBL_ENTRY _ZTV6G7x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y1[];
Class_Descriptor cd_G7x4y1 = {  "G7x4y1", // class name
  bases_G7x4y1, 6,
  &(vtc_G7x4y1[0]), // expected_vtbl_contents
  &(vtt_G7x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y2  : E7x4 , virtual F1 {
  int ff;
  ~G7x4y2(); // tgen
  G7x4y2(); // tgen
};
//SIG(1 G7x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x4y2 ::~G7x4y2(){ note_dtor("G7x4y2", this);} // tgen
G7x4y2 ::G7x4y2(){ note_ctor("G7x4y2", this);} // tgen

static void Test_G7x4y2()
{
  extern Class_Descriptor cd_G7x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G7x4y2, buf);
    G7x4y2 *dp, &lv = *(dp=new (buf) G7x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G7x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y2)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(32,24), "G7x4y2");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), 0, "G7x4y2");
    check_base_class_offset(lv, (C7*)(E7x4*), 0, "G7x4y2");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(16,12), "G7x4y2");
    check_base_class_offset(lv, (E7x4*), 0, "G7x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G7x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G7x4y2.ff");
    test_class_info(&lv, &cd_G7x4y2);
    dp->~G7x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y2(Test_G7x4y2, "G7x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G7x4y2C1Ev();
extern void _ZN6G7x4y2D1Ev();
Name_Map name_map_G7x4y2[] = {
  NSPAIR(_ZN6G7x4y2C1Ev),
  NSPAIR(_ZN6G7x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y2[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G7x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y2[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y2[] = {
  {&(_ZTV6G7x4y2[4]),  4,13},
  {&(_tg__ZTV4E7x4__6G7x4y2[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y2[3]),  3,4},
  {&(_ZTV6G7x4y2[8]),  8,13},
  {&(_ZTV6G7x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6G7x4y2[];
extern  VTBL_ENTRY _ZTV6G7x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y2[];
Class_Descriptor cd_G7x4y2 = {  "G7x4y2", // class name
  bases_G7x4y2, 6,
  &(vtc_G7x4y2[0]), // expected_vtbl_contents
  &(vtt_G7x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G7x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y3  : virtual E7x4 , virtual F1 {
  int ff;
  ~G7x4y3(); // tgen
  G7x4y3(); // tgen
};
//SIG(1 G7x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x4y3 ::~G7x4y3(){ note_dtor("G7x4y3", this);} // tgen
G7x4y3 ::G7x4y3(){ note_ctor("G7x4y3", this);} // tgen

static void Test_G7x4y3()
{
  extern Class_Descriptor cd_G7x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x4y3, buf);
    G7x4y3 *dp, &lv = *(dp=new (buf) G7x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y3)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(40,28), "G7x4y3");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), ABISELECT(16,8), "G7x4y3");
    check_base_class_offset(lv, (C7*)(E7x4*), ABISELECT(16,8), "G7x4y3");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(32,20), "G7x4y3");
    check_base_class_offset(lv, (E7x4*), ABISELECT(16,8), "G7x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G7x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x4y3.ff");
    test_class_info(&lv, &cd_G7x4y3);
    dp->~G7x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y3(Test_G7x4y3, "G7x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G7x4y3C1Ev();
extern void _ZN6G7x4y3D1Ev();
Name_Map name_map_G7x4y3[] = {
  NSPAIR(_ZN6G7x4y3C1Ev),
  NSPAIR(_ZN6G7x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y3[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G7x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y3[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y3[] = {
  {&(_ZTV6G7x4y3[5]),  5,18},
  {&(_ZTV6G7x4y3[9]),  9,18},
  {&(_ZTV6G7x4y3[13]),  13,18},
  {&(_ZTV6G7x4y3[17]),  17,18},
  {&(_tg__ZTV4E7x4__6G7x4y3[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x4y3[];
extern  VTBL_ENTRY _ZTV6G7x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y3[];
Class_Descriptor cd_G7x4y3 = {  "G7x4y3", // class name
  bases_G7x4y3, 6,
  &(vtc_G7x4y3[0]), // expected_vtbl_contents
  &(vtt_G7x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G7x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y4  : E7x4 , F0 {
  int ff;
  ~G7x4y4(); // tgen
  G7x4y4(); // tgen
};
//SIG(1 G7x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G7x4y4 ::~G7x4y4(){ note_dtor("G7x4y4", this);} // tgen
G7x4y4 ::G7x4y4(){ note_ctor("G7x4y4", this);} // tgen

static void Test_G7x4y4()
{
  extern Class_Descriptor cd_G7x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x4y4, buf);
    G7x4y4 *dp, &lv = *(dp=new (buf) G7x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y4)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(32,28), "G7x4y4");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), 0, "G7x4y4");
    check_base_class_offset(lv, (C7*)(E7x4*), 0, "G7x4y4");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(16,12), "G7x4y4");
    check_base_class_offset(lv, (E7x4*), 0, "G7x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G7x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G7x4y4.ff");
    test_class_info(&lv, &cd_G7x4y4);
    dp->~G7x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y4(Test_G7x4y4, "G7x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G7x4y4C1Ev();
extern void _ZN6G7x4y4D1Ev();
Name_Map name_map_G7x4y4[] = {
  NSPAIR(_ZN6G7x4y4C1Ev),
  NSPAIR(_ZN6G7x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y4[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G7x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y4[] = {
  {&(_ZTV6G7x4y4[3]),  3,8},
  {&(_tg__ZTV4E7x4__6G7x4y4[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y4[3]),  3,4},
  {&(_ZTV6G7x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G7x4y4[];
extern  VTBL_ENTRY _ZTV6G7x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y4[];
Class_Descriptor cd_G7x4y4 = {  "G7x4y4", // class name
  bases_G7x4y4, 6,
  &(vtc_G7x4y4[0]), // expected_vtbl_contents
  &(vtt_G7x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G7x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y5  : virtual E7x4 , F0 {
  int ff;
  ~G7x4y5(); // tgen
  G7x4y5(); // tgen
};
//SIG(1 G7x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G7x4y5 ::~G7x4y5(){ note_dtor("G7x4y5", this);} // tgen
G7x4y5 ::G7x4y5(){ note_ctor("G7x4y5", this);} // tgen

static void Test_G7x4y5()
{
  extern Class_Descriptor cd_G7x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x4y5, buf);
    G7x4y5 *dp, &lv = *(dp=new (buf) G7x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y5)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(40,32), "G7x4y5");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), ABISELECT(16,12), "G7x4y5");
    check_base_class_offset(lv, (C7*)(E7x4*), ABISELECT(16,12), "G7x4y5");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(32,24), "G7x4y5");
    check_base_class_offset(lv, (E7x4*), ABISELECT(16,12), "G7x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x4y5.ff");
    test_class_info(&lv, &cd_G7x4y5);
    dp->~G7x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y5(Test_G7x4y5, "G7x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x4y5C1Ev();
extern void _ZN6G7x4y5D1Ev();
Name_Map name_map_G7x4y5[] = {
  NSPAIR(_ZN6G7x4y5C1Ev),
  NSPAIR(_ZN6G7x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y5[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G7x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y5[] = {
  {&(_ZTV6G7x4y5[4]),  4,13},
  {&(_ZTV6G7x4y5[8]),  8,13},
  {&(_ZTV6G7x4y5[12]),  12,13},
  {&(_tg__ZTV4E7x4__6G7x4y5[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x4y5[];
extern  VTBL_ENTRY _ZTV6G7x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y5[];
Class_Descriptor cd_G7x4y5 = {  "G7x4y5", // class name
  bases_G7x4y5, 6,
  &(vtc_G7x4y5[0]), // expected_vtbl_contents
  &(vtt_G7x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y6  : E7x4 , virtual F0 {
  int ff;
  ~G7x4y6(); // tgen
  G7x4y6(); // tgen
};
//SIG(1 G7x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x4y6 ::~G7x4y6(){ note_dtor("G7x4y6", this);} // tgen
G7x4y6 ::G7x4y6(){ note_ctor("G7x4y6", this);} // tgen

static void Test_G7x4y6()
{
  extern Class_Descriptor cd_G7x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x4y6, buf);
    G7x4y6 *dp, &lv = *(dp=new (buf) G7x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y6)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(32,24), "G7x4y6");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), 0, "G7x4y6");
    check_base_class_offset(lv, (C7*)(E7x4*), 0, "G7x4y6");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(16,12), "G7x4y6");
    check_base_class_offset(lv, (E7x4*), 0, "G7x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G7x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G7x4y6.ff");
    test_class_info(&lv, &cd_G7x4y6);
    dp->~G7x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y6(Test_G7x4y6, "G7x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G7x4y6C1Ev();
extern void _ZN6G7x4y6D1Ev();
Name_Map name_map_G7x4y6[] = {
  NSPAIR(_ZN6G7x4y6C1Ev),
  NSPAIR(_ZN6G7x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y6[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y6[] = {
  {&(_ZTV6G7x4y6[4]),  4,9},
  {&(_tg__ZTV4E7x4__6G7x4y6[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y6[3]),  3,4},
  {&(_ZTV6G7x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G7x4y6[];
extern  VTBL_ENTRY _ZTV6G7x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y6[];
Class_Descriptor cd_G7x4y6 = {  "G7x4y6", // class name
  bases_G7x4y6, 6,
  &(vtc_G7x4y6[0]), // expected_vtbl_contents
  &(vtt_G7x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G7x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x4y7  : virtual E7x4 , virtual F0 {
  int ff;
  ~G7x4y7(); // tgen
  G7x4y7(); // tgen
};
//SIG(1 G7x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x4y7 ::~G7x4y7(){ note_dtor("G7x4y7", this);} // tgen
G7x4y7 ::G7x4y7(){ note_ctor("G7x4y7", this);} // tgen

static void Test_G7x4y7()
{
  extern Class_Descriptor cd_G7x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x4y7, buf);
    G7x4y7 *dp, &lv = *(dp=new (buf) G7x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x4y7)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x4*), ABISELECT(40,28), "G7x4y7");
    check_base_class_offset(lv, (B1*)(C7*)(E7x4*), ABISELECT(16,8), "G7x4y7");
    check_base_class_offset(lv, (C7*)(E7x4*), ABISELECT(16,8), "G7x4y7");
    check_base_class_offset(lv, (D0*)(E7x4*), ABISELECT(32,20), "G7x4y7");
    check_base_class_offset(lv, (E7x4*), ABISELECT(16,8), "G7x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G7x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x4y7.ff");
    test_class_info(&lv, &cd_G7x4y7);
    dp->~G7x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x4y7(Test_G7x4y7, "G7x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x4y7C1Ev();
extern void _ZN6G7x4y7D1Ev();
Name_Map name_map_G7x4y7[] = {
  NSPAIR(_ZN6G7x4y7C1Ev),
  NSPAIR(_ZN6G7x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x4;
extern VTBL_ENTRY _ZTI4E7x4[];
extern  VTBL_ENTRY _ZTV4E7x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x4y7[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x4y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x4__6G7x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x4__6G7x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x4__6G7x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x4__6G7x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x4y7[] = {
  {&(_ZTV6G7x4y7[5]),  5,14},
  {&(_ZTV6G7x4y7[9]),  9,14},
  {&(_ZTV6G7x4y7[13]),  13,14},
  {&(_tg__ZTV4E7x4__6G7x4y7[3]),  3,4},
  {&(_tg__ZTV2C74E7x4__6G7x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x4__6G7x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x4__6G7x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x4y7[];
extern  VTBL_ENTRY _ZTV6G7x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x4y7[];
Class_Descriptor cd_G7x4y7 = {  "G7x4y7", // class name
  bases_G7x4y7, 6,
  &(vtc_G7x4y7[0]), // expected_vtbl_contents
  &(vtt_G7x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x4y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x4y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x4  : C8 , D0 {
  int fd;
  ~E8x4(); // tgen
  E8x4(); // tgen
};
//SIG(-1 E8x4) C1{ BC2{ BC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E8x4 ::~E8x4(){ note_dtor("E8x4", this);} // tgen
E8x4 ::E8x4(){ note_ctor("E8x4", this);} // tgen

static void Test_E8x4()
{
  extern Class_Descriptor cd_E8x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E8x4, buf);
    E8x4 *dp, &lv = *(dp=new (buf) E8x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E8x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x4)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(8,4), "E8x4");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(24,20), "E8x4");
    check_base_class_offset(lv, (C8*), 0, "E8x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E8x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E8x4.fd");
    test_class_info(&lv, &cd_E8x4);
    dp->~E8x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x4(Test_E8x4, "E8x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E8x4C1Ev();
extern void _ZN4E8x4D1Ev();
Name_Map name_map_E8x4[] = {
  NSPAIR(_ZN4E8x4C1Ev),
  NSPAIR(_ZN4E8x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E8x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E8x4[];
static  VTBL_ENTRY vtc_E8x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
extern VTBL_ENTRY _ZTV4E8x4[];
static  VTBL_ENTRY _tg__ZTV2C8__4E8x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x4[] = {
  {&(_ZTV4E8x4[3]),  3,3},
  {&(_tg__ZTV2C8__4E8x4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
Class_Descriptor cd_E8x4 = {  "E8x4", // class name
  bases_E8x4, 4,
  &(vtc_E8x4[0]), // expected_vtbl_contents
  &(vtt_E8x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E8x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E8x4),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E8x4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y0  : E8x4 , F1 {
  int ff;
  ~G8x4y0(); // tgen
  G8x4y0(); // tgen
};
//SIG(1 G8x4y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x4y0 ::~G8x4y0(){ note_dtor("G8x4y0", this);} // tgen
G8x4y0 ::G8x4y0(){ note_ctor("G8x4y0", this);} // tgen

static void Test_G8x4y0()
{
  extern Class_Descriptor cd_G8x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x4y0, buf);
    G8x4y0 *dp, &lv = *(dp=new (buf) G8x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y0)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(8,4), "G8x4y0");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(40,32), "G8x4y0");
    check_base_class_offset(lv, (C8*)(E8x4*), 0, "G8x4y0");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(16,12), "G8x4y0");
    check_base_class_offset(lv, (E8x4*), 0, "G8x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G8x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G8x4y0.ff");
    test_class_info(&lv, &cd_G8x4y0);
    dp->~G8x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y0(Test_G8x4y0, "G8x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x4y0C1Ev();
extern void _ZN6G8x4y0D1Ev();
Name_Map name_map_G8x4y0[] = {
  NSPAIR(_ZN6G8x4y0C1Ev),
  NSPAIR(_ZN6G8x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y0[0]),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G8x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x4y0[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y0[] = {
  {&(_ZTV6G8x4y0[3]),  3,6},
  {&(_tg__ZTV4E8x4__6G8x4y0[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y0[];
extern  VTBL_ENTRY _ZTV6G8x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y0[];
Class_Descriptor cd_G8x4y0 = {  "G8x4y0", // class name
  bases_G8x4y0, 6,
  &(vtc_G8x4y0[0]), // expected_vtbl_contents
  &(vtt_G8x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y0),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y1  : virtual E8x4 , F1 {
  int ff;
  ~G8x4y1(); // tgen
  G8x4y1(); // tgen
};
//SIG(1 G8x4y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x4y1 ::~G8x4y1(){ note_dtor("G8x4y1", this);} // tgen
G8x4y1 ::G8x4y1(){ note_ctor("G8x4y1", this);} // tgen

static void Test_G8x4y1()
{
  extern Class_Descriptor cd_G8x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x4y1, buf);
    G8x4y1 *dp, &lv = *(dp=new (buf) G8x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y1)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(24,16), "G8x4y1");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(40,32), "G8x4y1");
    check_base_class_offset(lv, (C8*)(E8x4*), ABISELECT(16,12), "G8x4y1");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(32,24), "G8x4y1");
    check_base_class_offset(lv, (E8x4*), ABISELECT(16,12), "G8x4y1");
    check_base_class_offset(lv, (F1*), 0, "G8x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x4y1.ff");
    test_class_info(&lv, &cd_G8x4y1);
    dp->~G8x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y1(Test_G8x4y1, "G8x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x4y1C1Ev();
extern void _ZN6G8x4y1D1Ev();
Name_Map name_map_G8x4y1[] = {
  NSPAIR(_ZN6G8x4y1C1Ev),
  NSPAIR(_ZN6G8x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x4y1[0]),
};
extern VTBL_ENTRY _ZTV6G8x4y1[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y1[] = {
  {&(_ZTV6G8x4y1[4]),  4,8},
  {&(_ZTV6G8x4y1[8]),  8,8},
  {&(_tg__ZTV4E8x4__6G8x4y1[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y1[];
extern  VTBL_ENTRY _ZTV6G8x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y1[];
Class_Descriptor cd_G8x4y1 = {  "G8x4y1", // class name
  bases_G8x4y1, 6,
  &(vtc_G8x4y1[0]), // expected_vtbl_contents
  &(vtt_G8x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y1),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y2  : E8x4 , virtual F1 {
  int ff;
  ~G8x4y2(); // tgen
  G8x4y2(); // tgen
};
//SIG(1 G8x4y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x4y2 ::~G8x4y2(){ note_dtor("G8x4y2", this);} // tgen
G8x4y2 ::G8x4y2(){ note_ctor("G8x4y2", this);} // tgen

static void Test_G8x4y2()
{
  extern Class_Descriptor cd_G8x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x4y2, buf);
    G8x4y2 *dp, &lv = *(dp=new (buf) G8x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y2)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(8,4), "G8x4y2");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(28,24), "G8x4y2");
    check_base_class_offset(lv, (C8*)(E8x4*), 0, "G8x4y2");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(16,12), "G8x4y2");
    check_base_class_offset(lv, (E8x4*), 0, "G8x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G8x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G8x4y2.ff");
    test_class_info(&lv, &cd_G8x4y2);
    dp->~G8x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y2(Test_G8x4y2, "G8x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x4y2C1Ev();
extern void _ZN6G8x4y2D1Ev();
Name_Map name_map_G8x4y2[] = {
  NSPAIR(_ZN6G8x4y2C1Ev),
  NSPAIR(_ZN6G8x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G8x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x4y2[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y2[] = {
  {&(_ZTV6G8x4y2[4]),  4,8},
  {&(_tg__ZTV4E8x4__6G8x4y2[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y2[3]),  3,3},
  {&(_ZTV6G8x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G8x4y2[];
extern  VTBL_ENTRY _ZTV6G8x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y2[];
Class_Descriptor cd_G8x4y2 = {  "G8x4y2", // class name
  bases_G8x4y2, 6,
  &(vtc_G8x4y2[0]), // expected_vtbl_contents
  &(vtt_G8x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y2),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y3  : virtual E8x4 , virtual F1 {
  int ff;
  ~G8x4y3(); // tgen
  G8x4y3(); // tgen
};
//SIG(1 G8x4y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x4y3 ::~G8x4y3(){ note_dtor("G8x4y3", this);} // tgen
G8x4y3 ::G8x4y3(){ note_ctor("G8x4y3", this);} // tgen

static void Test_G8x4y3()
{
  extern Class_Descriptor cd_G8x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x4y3, buf);
    G8x4y3 *dp, &lv = *(dp=new (buf) G8x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y3)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(24,12), "G8x4y3");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(40,28), "G8x4y3");
    check_base_class_offset(lv, (C8*)(E8x4*), ABISELECT(16,8), "G8x4y3");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(32,20), "G8x4y3");
    check_base_class_offset(lv, (E8x4*), ABISELECT(16,8), "G8x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G8x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x4y3.ff");
    test_class_info(&lv, &cd_G8x4y3);
    dp->~G8x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y3(Test_G8x4y3, "G8x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G8x4y3C1Ev();
extern void _ZN6G8x4y3D1Ev();
Name_Map name_map_G8x4y3[] = {
  NSPAIR(_ZN6G8x4y3C1Ev),
  NSPAIR(_ZN6G8x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y3[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x4y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G8x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x4y3[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y3[] = {
  {&(_ZTV6G8x4y3[5]),  5,12},
  {&(_ZTV6G8x4y3[8]),  8,12},
  {&(_ZTV6G8x4y3[11]),  11,12},
  {&(_tg__ZTV4E8x4__6G8x4y3[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y3[];
extern  VTBL_ENTRY _ZTV6G8x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y3[];
Class_Descriptor cd_G8x4y3 = {  "G8x4y3", // class name
  bases_G8x4y3, 6,
  &(vtc_G8x4y3[0]), // expected_vtbl_contents
  &(vtt_G8x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G8x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y3),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y4  : E8x4 , F0 {
  int ff;
  ~G8x4y4(); // tgen
  G8x4y4(); // tgen
};
//SIG(1 G8x4y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G8x4y4 ::~G8x4y4(){ note_dtor("G8x4y4", this);} // tgen
G8x4y4 ::G8x4y4(){ note_ctor("G8x4y4", this);} // tgen

static void Test_G8x4y4()
{
  extern Class_Descriptor cd_G8x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x4y4, buf);
    G8x4y4 *dp, &lv = *(dp=new (buf) G8x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y4)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(8,4), "G8x4y4");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(32,28), "G8x4y4");
    check_base_class_offset(lv, (C8*)(E8x4*), 0, "G8x4y4");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(16,12), "G8x4y4");
    check_base_class_offset(lv, (E8x4*), 0, "G8x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G8x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G8x4y4.ff");
    test_class_info(&lv, &cd_G8x4y4);
    dp->~G8x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y4(Test_G8x4y4, "G8x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G8x4y4C1Ev();
extern void _ZN6G8x4y4D1Ev();
Name_Map name_map_G8x4y4[] = {
  NSPAIR(_ZN6G8x4y4C1Ev),
  NSPAIR(_ZN6G8x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y4[];
static  VTBL_ENTRY vtc_G8x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y4[0]),
};
extern VTBL_ENTRY _ZTV6G8x4y4[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y4[] = {
  {&(_ZTV6G8x4y4[3]),  3,3},
  {&(_tg__ZTV4E8x4__6G8x4y4[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y4[];
extern  VTBL_ENTRY _ZTV6G8x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y4[];
Class_Descriptor cd_G8x4y4 = {  "G8x4y4", // class name
  bases_G8x4y4, 6,
  &(vtc_G8x4y4[0]), // expected_vtbl_contents
  &(vtt_G8x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G8x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y4),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y5  : virtual E8x4 , F0 {
  int ff;
  ~G8x4y5(); // tgen
  G8x4y5(); // tgen
};
//SIG(1 G8x4y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G8x4y5 ::~G8x4y5(){ note_dtor("G8x4y5", this);} // tgen
G8x4y5 ::G8x4y5(){ note_ctor("G8x4y5", this);} // tgen

static void Test_G8x4y5()
{
  extern Class_Descriptor cd_G8x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x4y5, buf);
    G8x4y5 *dp, &lv = *(dp=new (buf) G8x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y5)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(24,16), "G8x4y5");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(40,32), "G8x4y5");
    check_base_class_offset(lv, (C8*)(E8x4*), ABISELECT(16,12), "G8x4y5");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(32,24), "G8x4y5");
    check_base_class_offset(lv, (E8x4*), ABISELECT(16,12), "G8x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x4y5.ff");
    test_class_info(&lv, &cd_G8x4y5);
    dp->~G8x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y5(Test_G8x4y5, "G8x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x4y5C1Ev();
extern void _ZN6G8x4y5D1Ev();
Name_Map name_map_G8x4y5[] = {
  NSPAIR(_ZN6G8x4y5C1Ev),
  NSPAIR(_ZN6G8x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y5[];
static  VTBL_ENTRY vtc_G8x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y5[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x4y5[0]),
};
extern VTBL_ENTRY _ZTV6G8x4y5[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y5[] = {
  {&(_ZTV6G8x4y5[4]),  4,7},
  {&(_ZTV6G8x4y5[7]),  7,7},
  {&(_tg__ZTV4E8x4__6G8x4y5[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y5[];
extern  VTBL_ENTRY _ZTV6G8x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y5[];
Class_Descriptor cd_G8x4y5 = {  "G8x4y5", // class name
  bases_G8x4y5, 6,
  &(vtc_G8x4y5[0]), // expected_vtbl_contents
  &(vtt_G8x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y5),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y6  : E8x4 , virtual F0 {
  int ff;
  ~G8x4y6(); // tgen
  G8x4y6(); // tgen
};
//SIG(1 G8x4y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x4y6 ::~G8x4y6(){ note_dtor("G8x4y6", this);} // tgen
G8x4y6 ::G8x4y6(){ note_ctor("G8x4y6", this);} // tgen

static void Test_G8x4y6()
{
  extern Class_Descriptor cd_G8x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x4y6, buf);
    G8x4y6 *dp, &lv = *(dp=new (buf) G8x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y6)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(8,4), "G8x4y6");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(28,24), "G8x4y6");
    check_base_class_offset(lv, (C8*)(E8x4*), 0, "G8x4y6");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(16,12), "G8x4y6");
    check_base_class_offset(lv, (E8x4*), 0, "G8x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G8x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G8x4y6.ff");
    test_class_info(&lv, &cd_G8x4y6);
    dp->~G8x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y6(Test_G8x4y6, "G8x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G8x4y6C1Ev();
extern void _ZN6G8x4y6D1Ev();
Name_Map name_map_G8x4y6[] = {
  NSPAIR(_ZN6G8x4y6C1Ev),
  NSPAIR(_ZN6G8x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y6[];
static  VTBL_ENTRY vtc_G8x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y6[0]),
};
extern VTBL_ENTRY _ZTV6G8x4y6[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y6[] = {
  {&(_ZTV6G8x4y6[4]),  4,4},
  {&(_tg__ZTV4E8x4__6G8x4y6[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y6[];
extern  VTBL_ENTRY _ZTV6G8x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y6[];
Class_Descriptor cd_G8x4y6 = {  "G8x4y6", // class name
  bases_G8x4y6, 6,
  &(vtc_G8x4y6[0]), // expected_vtbl_contents
  &(vtt_G8x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G8x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y6),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x4y7  : virtual E8x4 , virtual F0 {
  int ff;
  ~G8x4y7(); // tgen
  G8x4y7(); // tgen
};
//SIG(1 G8x4y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x4y7 ::~G8x4y7(){ note_dtor("G8x4y7", this);} // tgen
G8x4y7 ::G8x4y7(){ note_ctor("G8x4y7", this);} // tgen

static void Test_G8x4y7()
{
  extern Class_Descriptor cd_G8x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x4y7, buf);
    G8x4y7 *dp, &lv = *(dp=new (buf) G8x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x4y7)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x4*), ABISELECT(24,12), "G8x4y7");
    check_base_class_offset(lv, (B0*)(C8*)(E8x4*), ABISELECT(40,28), "G8x4y7");
    check_base_class_offset(lv, (C8*)(E8x4*), ABISELECT(16,8), "G8x4y7");
    check_base_class_offset(lv, (D0*)(E8x4*), ABISELECT(32,20), "G8x4y7");
    check_base_class_offset(lv, (E8x4*), ABISELECT(16,8), "G8x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G8x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x4y7.ff");
    test_class_info(&lv, &cd_G8x4y7);
    dp->~G8x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x4y7(Test_G8x4y7, "G8x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x4y7C1Ev();
extern void _ZN6G8x4y7D1Ev();
Name_Map name_map_G8x4y7[] = {
  NSPAIR(_ZN6G8x4y7C1Ev),
  NSPAIR(_ZN6G8x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x4;
extern VTBL_ENTRY _ZTI4E8x4[];
extern  VTBL_ENTRY _ZTV4E8x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x4y7[];
static  VTBL_ENTRY vtc_G8x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x4y7[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x4y7[0]),
};
extern VTBL_ENTRY _ZTV6G8x4y7[];
static  VTBL_ENTRY _tg__ZTV4E8x4__6G8x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x4[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x4__6G8x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x4y7[] = {
  {&(_ZTV6G8x4y7[5]),  5,8},
  {&(_ZTV6G8x4y7[8]),  8,8},
  {&(_tg__ZTV4E8x4__6G8x4y7[3]),  3,3},
  {&(_tg__ZTV2C84E8x4__6G8x4y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x4y7[];
extern  VTBL_ENTRY _ZTV6G8x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x4y7[];
Class_Descriptor cd_G8x4y7 = {  "G8x4y7", // class name
  bases_G8x4y7, 6,
  &(vtc_G8x4y7[0]), // expected_vtbl_contents
  &(vtt_G8x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x4y7),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x4y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E9x4  : C9 , D0 {
  int fd;
  ~E9x4(); // tgen
  E9x4(); // tgen
};
//SIG(-1 E9x4) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E9x4 ::~E9x4(){ note_dtor("E9x4", this);} // tgen
E9x4 ::E9x4(){ note_ctor("E9x4", this);} // tgen

static void Test_E9x4()
{
  extern Class_Descriptor cd_E9x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E9x4, buf);
    E9x4 *dp, &lv = *(dp=new (buf) E9x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E9x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x4)");
    check_base_class_offset(lv, (A1*)(C9*), 0, "E9x4");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(24,20), "E9x4");
    check_base_class_offset(lv, (C9*), 0, "E9x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E9x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E9x4.fd");
    test_class_info(&lv, &cd_E9x4);
    dp->~E9x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x4(Test_E9x4, "E9x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E9x4C1Ev();
extern void _ZN4E9x4D1Ev();
Name_Map name_map_E9x4[] = {
  NSPAIR(_ZN4E9x4C1Ev),
  NSPAIR(_ZN4E9x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E9x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E9x4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E9x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E9x4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x4[] = {
  {&(_ZTV4E9x4[3]),  3,4},
  {&(_tg__ZTV2C9__4E9x4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
Class_Descriptor cd_E9x4 = {  "E9x4", // class name
  bases_E9x4, 4,
  &(vtc_E9x4[0]), // expected_vtbl_contents
  &(vtt_E9x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E9x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E9x4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E9x4),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y0  : E9x4 , F1 {
  int ff;
  ~G9x4y0(); // tgen
  G9x4y0(); // tgen
};
//SIG(1 G9x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x4y0 ::~G9x4y0(){ note_dtor("G9x4y0", this);} // tgen
G9x4y0 ::G9x4y0(){ note_ctor("G9x4y0", this);} // tgen

static void Test_G9x4y0()
{
  extern Class_Descriptor cd_G9x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x4y0, buf);
    G9x4y0 *dp, &lv = *(dp=new (buf) G9x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y0)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), 0, "G9x4y0");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(40,32), "G9x4y0");
    check_base_class_offset(lv, (C9*)(E9x4*), 0, "G9x4y0");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(16,12), "G9x4y0");
    check_base_class_offset(lv, (E9x4*), 0, "G9x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G9x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G9x4y0.ff");
    test_class_info(&lv, &cd_G9x4y0);
    dp->~G9x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y0(Test_G9x4y0, "G9x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x4y0C1Ev();
extern void _ZN6G9x4y0D1Ev();
Name_Map name_map_G9x4y0[] = {
  NSPAIR(_ZN6G9x4y0C1Ev),
  NSPAIR(_ZN6G9x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y0[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G9x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y0[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y0[] = {
  {&(_ZTV6G9x4y0[3]),  3,7},
  {&(_tg__ZTV4E9x4__6G9x4y0[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y0[];
extern  VTBL_ENTRY _ZTV6G9x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y0[];
Class_Descriptor cd_G9x4y0 = {  "G9x4y0", // class name
  bases_G9x4y0, 6,
  &(vtc_G9x4y0[0]), // expected_vtbl_contents
  &(vtt_G9x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y1  : virtual E9x4 , F1 {
  int ff;
  ~G9x4y1(); // tgen
  G9x4y1(); // tgen
};
//SIG(1 G9x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x4y1 ::~G9x4y1(){ note_dtor("G9x4y1", this);} // tgen
G9x4y1 ::G9x4y1(){ note_ctor("G9x4y1", this);} // tgen

static void Test_G9x4y1()
{
  extern Class_Descriptor cd_G9x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x4y1, buf);
    G9x4y1 *dp, &lv = *(dp=new (buf) G9x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y1)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), ABISELECT(16,12), "G9x4y1");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(40,32), "G9x4y1");
    check_base_class_offset(lv, (C9*)(E9x4*), ABISELECT(16,12), "G9x4y1");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(32,24), "G9x4y1");
    check_base_class_offset(lv, (E9x4*), ABISELECT(16,12), "G9x4y1");
    check_base_class_offset(lv, (F1*), 0, "G9x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x4y1.ff");
    test_class_info(&lv, &cd_G9x4y1);
    dp->~G9x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y1(Test_G9x4y1, "G9x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x4y1C1Ev();
extern void _ZN6G9x4y1D1Ev();
Name_Map name_map_G9x4y1[] = {
  NSPAIR(_ZN6G9x4y1C1Ev),
  NSPAIR(_ZN6G9x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y1[] = {
  {&(_ZTV6G9x4y1[4]),  4,10},
  {&(_ZTV6G9x4y1[9]),  9,10},
  {&(_tg__ZTV4E9x4__6G9x4y1[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y1[];
extern  VTBL_ENTRY _ZTV6G9x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y1[];
Class_Descriptor cd_G9x4y1 = {  "G9x4y1", // class name
  bases_G9x4y1, 6,
  &(vtc_G9x4y1[0]), // expected_vtbl_contents
  &(vtt_G9x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y2  : E9x4 , virtual F1 {
  int ff;
  ~G9x4y2(); // tgen
  G9x4y2(); // tgen
};
//SIG(1 G9x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x4y2 ::~G9x4y2(){ note_dtor("G9x4y2", this);} // tgen
G9x4y2 ::G9x4y2(){ note_ctor("G9x4y2", this);} // tgen

static void Test_G9x4y2()
{
  extern Class_Descriptor cd_G9x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x4y2, buf);
    G9x4y2 *dp, &lv = *(dp=new (buf) G9x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y2)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), 0, "G9x4y2");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(28,24), "G9x4y2");
    check_base_class_offset(lv, (C9*)(E9x4*), 0, "G9x4y2");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(16,12), "G9x4y2");
    check_base_class_offset(lv, (E9x4*), 0, "G9x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G9x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G9x4y2.ff");
    test_class_info(&lv, &cd_G9x4y2);
    dp->~G9x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y2(Test_G9x4y2, "G9x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x4y2C1Ev();
extern void _ZN6G9x4y2D1Ev();
Name_Map name_map_G9x4y2[] = {
  NSPAIR(_ZN6G9x4y2C1Ev),
  NSPAIR(_ZN6G9x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G9x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y2[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y2[] = {
  {&(_ZTV6G9x4y2[4]),  4,9},
  {&(_tg__ZTV4E9x4__6G9x4y2[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y2[3]),  3,4},
  {&(_ZTV6G9x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G9x4y2[];
extern  VTBL_ENTRY _ZTV6G9x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y2[];
Class_Descriptor cd_G9x4y2 = {  "G9x4y2", // class name
  bases_G9x4y2, 6,
  &(vtc_G9x4y2[0]), // expected_vtbl_contents
  &(vtt_G9x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y3  : virtual E9x4 , virtual F1 {
  int ff;
  ~G9x4y3(); // tgen
  G9x4y3(); // tgen
};
//SIG(1 G9x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x4y3 ::~G9x4y3(){ note_dtor("G9x4y3", this);} // tgen
G9x4y3 ::G9x4y3(){ note_ctor("G9x4y3", this);} // tgen

static void Test_G9x4y3()
{
  extern Class_Descriptor cd_G9x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x4y3, buf);
    G9x4y3 *dp, &lv = *(dp=new (buf) G9x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y3)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), ABISELECT(16,8), "G9x4y3");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(40,28), "G9x4y3");
    check_base_class_offset(lv, (C9*)(E9x4*), ABISELECT(16,8), "G9x4y3");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(32,20), "G9x4y3");
    check_base_class_offset(lv, (E9x4*), ABISELECT(16,8), "G9x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G9x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x4y3.ff");
    test_class_info(&lv, &cd_G9x4y3);
    dp->~G9x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y3(Test_G9x4y3, "G9x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G9x4y3C1Ev();
extern void _ZN6G9x4y3D1Ev();
Name_Map name_map_G9x4y3[] = {
  NSPAIR(_ZN6G9x4y3C1Ev),
  NSPAIR(_ZN6G9x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G9x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y3[] = {
  {&(_ZTV6G9x4y3[5]),  5,14},
  {&(_ZTV6G9x4y3[9]),  9,14},
  {&(_ZTV6G9x4y3[13]),  13,14},
  {&(_tg__ZTV4E9x4__6G9x4y3[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y3[];
extern  VTBL_ENTRY _ZTV6G9x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y3[];
Class_Descriptor cd_G9x4y3 = {  "G9x4y3", // class name
  bases_G9x4y3, 6,
  &(vtc_G9x4y3[0]), // expected_vtbl_contents
  &(vtt_G9x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G9x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y4  : E9x4 , F0 {
  int ff;
  ~G9x4y4(); // tgen
  G9x4y4(); // tgen
};
//SIG(1 G9x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G9x4y4 ::~G9x4y4(){ note_dtor("G9x4y4", this);} // tgen
G9x4y4 ::G9x4y4(){ note_ctor("G9x4y4", this);} // tgen

static void Test_G9x4y4()
{
  extern Class_Descriptor cd_G9x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x4y4, buf);
    G9x4y4 *dp, &lv = *(dp=new (buf) G9x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y4)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), 0, "G9x4y4");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(32,28), "G9x4y4");
    check_base_class_offset(lv, (C9*)(E9x4*), 0, "G9x4y4");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(16,12), "G9x4y4");
    check_base_class_offset(lv, (E9x4*), 0, "G9x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G9x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G9x4y4.ff");
    test_class_info(&lv, &cd_G9x4y4);
    dp->~G9x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y4(Test_G9x4y4, "G9x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G9x4y4C1Ev();
extern void _ZN6G9x4y4D1Ev();
Name_Map name_map_G9x4y4[] = {
  NSPAIR(_ZN6G9x4y4C1Ev),
  NSPAIR(_ZN6G9x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y4[] = {
  {&(_ZTV6G9x4y4[3]),  3,4},
  {&(_tg__ZTV4E9x4__6G9x4y4[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y4[];
extern  VTBL_ENTRY _ZTV6G9x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y4[];
Class_Descriptor cd_G9x4y4 = {  "G9x4y4", // class name
  bases_G9x4y4, 6,
  &(vtc_G9x4y4[0]), // expected_vtbl_contents
  &(vtt_G9x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G9x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y5  : virtual E9x4 , F0 {
  int ff;
  ~G9x4y5(); // tgen
  G9x4y5(); // tgen
};
//SIG(1 G9x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G9x4y5 ::~G9x4y5(){ note_dtor("G9x4y5", this);} // tgen
G9x4y5 ::G9x4y5(){ note_ctor("G9x4y5", this);} // tgen

static void Test_G9x4y5()
{
  extern Class_Descriptor cd_G9x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x4y5, buf);
    G9x4y5 *dp, &lv = *(dp=new (buf) G9x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y5)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), ABISELECT(16,12), "G9x4y5");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(40,32), "G9x4y5");
    check_base_class_offset(lv, (C9*)(E9x4*), ABISELECT(16,12), "G9x4y5");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(32,24), "G9x4y5");
    check_base_class_offset(lv, (E9x4*), ABISELECT(16,12), "G9x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x4y5.ff");
    test_class_info(&lv, &cd_G9x4y5);
    dp->~G9x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y5(Test_G9x4y5, "G9x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x4y5C1Ev();
extern void _ZN6G9x4y5D1Ev();
Name_Map name_map_G9x4y5[] = {
  NSPAIR(_ZN6G9x4y5C1Ev),
  NSPAIR(_ZN6G9x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y5[] = {
  {&(_ZTV6G9x4y5[4]),  4,9},
  {&(_ZTV6G9x4y5[8]),  8,9},
  {&(_tg__ZTV4E9x4__6G9x4y5[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y5[];
extern  VTBL_ENTRY _ZTV6G9x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y5[];
Class_Descriptor cd_G9x4y5 = {  "G9x4y5", // class name
  bases_G9x4y5, 6,
  &(vtc_G9x4y5[0]), // expected_vtbl_contents
  &(vtt_G9x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y6  : E9x4 , virtual F0 {
  int ff;
  ~G9x4y6(); // tgen
  G9x4y6(); // tgen
};
//SIG(1 G9x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x4y6 ::~G9x4y6(){ note_dtor("G9x4y6", this);} // tgen
G9x4y6 ::G9x4y6(){ note_ctor("G9x4y6", this);} // tgen

static void Test_G9x4y6()
{
  extern Class_Descriptor cd_G9x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x4y6, buf);
    G9x4y6 *dp, &lv = *(dp=new (buf) G9x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y6)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), 0, "G9x4y6");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(28,24), "G9x4y6");
    check_base_class_offset(lv, (C9*)(E9x4*), 0, "G9x4y6");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(16,12), "G9x4y6");
    check_base_class_offset(lv, (E9x4*), 0, "G9x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G9x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G9x4y6.ff");
    test_class_info(&lv, &cd_G9x4y6);
    dp->~G9x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y6(Test_G9x4y6, "G9x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G9x4y6C1Ev();
extern void _ZN6G9x4y6D1Ev();
Name_Map name_map_G9x4y6[] = {
  NSPAIR(_ZN6G9x4y6C1Ev),
  NSPAIR(_ZN6G9x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y6[] = {
  {&(_ZTV6G9x4y6[4]),  4,5},
  {&(_tg__ZTV4E9x4__6G9x4y6[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y6[];
extern  VTBL_ENTRY _ZTV6G9x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y6[];
Class_Descriptor cd_G9x4y6 = {  "G9x4y6", // class name
  bases_G9x4y6, 6,
  &(vtc_G9x4y6[0]), // expected_vtbl_contents
  &(vtt_G9x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G9x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x4y7  : virtual E9x4 , virtual F0 {
  int ff;
  ~G9x4y7(); // tgen
  G9x4y7(); // tgen
};
//SIG(1 G9x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x4y7 ::~G9x4y7(){ note_dtor("G9x4y7", this);} // tgen
G9x4y7 ::G9x4y7(){ note_ctor("G9x4y7", this);} // tgen

static void Test_G9x4y7()
{
  extern Class_Descriptor cd_G9x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x4y7, buf);
    G9x4y7 *dp, &lv = *(dp=new (buf) G9x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x4y7)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x4*), ABISELECT(16,8), "G9x4y7");
    check_base_class_offset(lv, (B0*)(C9*)(E9x4*), ABISELECT(40,28), "G9x4y7");
    check_base_class_offset(lv, (C9*)(E9x4*), ABISELECT(16,8), "G9x4y7");
    check_base_class_offset(lv, (D0*)(E9x4*), ABISELECT(32,20), "G9x4y7");
    check_base_class_offset(lv, (E9x4*), ABISELECT(16,8), "G9x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G9x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x4y7.ff");
    test_class_info(&lv, &cd_G9x4y7);
    dp->~G9x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x4y7(Test_G9x4y7, "G9x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x4y7C1Ev();
extern void _ZN6G9x4y7D1Ev();
Name_Map name_map_G9x4y7[] = {
  NSPAIR(_ZN6G9x4y7C1Ev),
  NSPAIR(_ZN6G9x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x4;
extern VTBL_ENTRY _ZTI4E9x4[];
extern  VTBL_ENTRY _ZTV4E9x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x4y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x4y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x4__6G9x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x4__6G9x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x4y7[] = {
  {&(_ZTV6G9x4y7[5]),  5,10},
  {&(_ZTV6G9x4y7[9]),  9,10},
  {&(_tg__ZTV4E9x4__6G9x4y7[3]),  3,4},
  {&(_tg__ZTV2C94E9x4__6G9x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x4y7[];
extern  VTBL_ENTRY _ZTV6G9x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x4y7[];
Class_Descriptor cd_G9x4y7 = {  "G9x4y7", // class name
  bases_G9x4y7, 6,
  &(vtc_G9x4y7[0]), // expected_vtbl_contents
  &(vtt_G9x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x4y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x4y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E10x4  : C10 , D0 {
  int fd;
  ~E10x4(); // tgen
  E10x4(); // tgen
};
//SIG(-1 E10x4) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E10x4 ::~E10x4(){ note_dtor("E10x4", this);} // tgen
E10x4 ::E10x4(){ note_ctor("E10x4", this);} // tgen

static void Test_E10x4()
{
  extern Class_Descriptor cd_E10x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E10x4, buf);
    E10x4 *dp, &lv = *(dp=new (buf) E10x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E10x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x4)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(20,16), "E10x4");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(24,20), "E10x4");
    check_base_class_offset(lv, (C10*), 0, "E10x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E10x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E10x4.fd");
    test_class_info(&lv, &cd_E10x4);
    dp->~E10x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x4(Test_E10x4, "E10x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E10x4C1Ev();
extern void _ZN5E10x4D1Ev();
Name_Map name_map_E10x4[] = {
  NSPAIR(_ZN5E10x4C1Ev),
  NSPAIR(_ZN5E10x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E10x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E10x4[];
static  VTBL_ENTRY vtc_E10x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
extern VTBL_ENTRY _ZTV5E10x4[];
static  VTBL_ENTRY _tg__ZTV3C10__5E10x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x4[] = {
  {&(_ZTV5E10x4[4]),  4,4},
  {&(_tg__ZTV3C10__5E10x4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
Class_Descriptor cd_E10x4 = {  "E10x4", // class name
  bases_E10x4, 4,
  &(vtc_E10x4[0]), // expected_vtbl_contents
  &(vtt_E10x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E10x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E10x4),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E10x4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y0  : E10x4 , F1 {
  int ff;
  ~G10x4y0(); // tgen
  G10x4y0(); // tgen
};
//SIG(1 G10x4y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x4y0 ::~G10x4y0(){ note_dtor("G10x4y0", this);} // tgen
G10x4y0 ::G10x4y0(){ note_ctor("G10x4y0", this);} // tgen

static void Test_G10x4y0()
{
  extern Class_Descriptor cd_G10x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x4y0, buf);
    G10x4y0 *dp, &lv = *(dp=new (buf) G10x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y0)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(40,28), "G10x4y0");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(44,32), "G10x4y0");
    check_base_class_offset(lv, (C10*)(E10x4*), 0, "G10x4y0");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(12,8), "G10x4y0");
    check_base_class_offset(lv, (E10x4*), 0, "G10x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G10x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G10x4y0.ff");
    test_class_info(&lv, &cd_G10x4y0);
    dp->~G10x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y0(Test_G10x4y0, "G10x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x4y0C1Ev();
extern void _ZN7G10x4y0D1Ev();
Name_Map name_map_G10x4y0[] = {
  NSPAIR(_ZN7G10x4y0C1Ev),
  NSPAIR(_ZN7G10x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x4y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G10x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x4y0[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y0[] = {
  {&(_ZTV7G10x4y0[4]),  4,7},
  {&(_tg__ZTV5E10x4__7G10x4y0[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y0[];
extern  VTBL_ENTRY _ZTV7G10x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y0[];
Class_Descriptor cd_G10x4y0 = {  "G10x4y0", // class name
  bases_G10x4y0, 6,
  &(vtc_G10x4y0[0]), // expected_vtbl_contents
  &(vtt_G10x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y0),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y1  : virtual E10x4 , F1 {
  int ff;
  ~G10x4y1(); // tgen
  G10x4y1(); // tgen
};
//SIG(1 G10x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x4y1 ::~G10x4y1(){ note_dtor("G10x4y1", this);} // tgen
G10x4y1 ::G10x4y1(){ note_ctor("G10x4y1", this);} // tgen

static void Test_G10x4y1()
{
  extern Class_Descriptor cd_G10x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x4y1, buf);
    G10x4y1 *dp, &lv = *(dp=new (buf) G10x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y1)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(36,28), "G10x4y1");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(40,32), "G10x4y1");
    check_base_class_offset(lv, (C10*)(E10x4*), ABISELECT(16,12), "G10x4y1");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(28,20), "G10x4y1");
    check_base_class_offset(lv, (E10x4*), ABISELECT(16,12), "G10x4y1");
    check_base_class_offset(lv, (F1*), 0, "G10x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x4y1.ff");
    test_class_info(&lv, &cd_G10x4y1);
    dp->~G10x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y1(Test_G10x4y1, "G10x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x4y1C1Ev();
extern void _ZN7G10x4y1D1Ev();
Name_Map name_map_G10x4y1[] = {
  NSPAIR(_ZN7G10x4y1C1Ev),
  NSPAIR(_ZN7G10x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x4y1[0]),
};
extern VTBL_ENTRY _ZTV7G10x4y1[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y1[] = {
  {&(_ZTV7G10x4y1[5]),  5,10},
  {&(_ZTV7G10x4y1[10]),  10,10},
  {&(_tg__ZTV5E10x4__7G10x4y1[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y1[];
extern  VTBL_ENTRY _ZTV7G10x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y1[];
Class_Descriptor cd_G10x4y1 = {  "G10x4y1", // class name
  bases_G10x4y1, 6,
  &(vtc_G10x4y1[0]), // expected_vtbl_contents
  &(vtt_G10x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y1),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y2  : E10x4 , virtual F1 {
  int ff;
  ~G10x4y2(); // tgen
  G10x4y2(); // tgen
};
//SIG(1 G10x4y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x4y2 ::~G10x4y2(){ note_dtor("G10x4y2", this);} // tgen
G10x4y2 ::G10x4y2(){ note_ctor("G10x4y2", this);} // tgen

static void Test_G10x4y2()
{
  extern Class_Descriptor cd_G10x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x4y2, buf);
    G10x4y2 *dp, &lv = *(dp=new (buf) G10x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y2)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(24,20), "G10x4y2");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(28,24), "G10x4y2");
    check_base_class_offset(lv, (C10*)(E10x4*), 0, "G10x4y2");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(12,8), "G10x4y2");
    check_base_class_offset(lv, (E10x4*), 0, "G10x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G10x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x4y2.ff");
    test_class_info(&lv, &cd_G10x4y2);
    dp->~G10x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y2(Test_G10x4y2, "G10x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x4y2C1Ev();
extern void _ZN7G10x4y2D1Ev();
Name_Map name_map_G10x4y2[] = {
  NSPAIR(_ZN7G10x4y2C1Ev),
  NSPAIR(_ZN7G10x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G10x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x4y2[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y2[] = {
  {&(_ZTV7G10x4y2[5]),  5,9},
  {&(_tg__ZTV5E10x4__7G10x4y2[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y2[4]),  4,4},
  {&(_ZTV7G10x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G10x4y2[];
extern  VTBL_ENTRY _ZTV7G10x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y2[];
Class_Descriptor cd_G10x4y2 = {  "G10x4y2", // class name
  bases_G10x4y2, 6,
  &(vtc_G10x4y2[0]), // expected_vtbl_contents
  &(vtt_G10x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y2),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y3  : virtual E10x4 , virtual F1 {
  int ff;
  ~G10x4y3(); // tgen
  G10x4y3(); // tgen
};
//SIG(1 G10x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x4y3 ::~G10x4y3(){ note_dtor("G10x4y3", this);} // tgen
G10x4y3 ::G10x4y3(){ note_ctor("G10x4y3", this);} // tgen

static void Test_G10x4y3()
{
  extern Class_Descriptor cd_G10x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x4y3, buf);
    G10x4y3 *dp, &lv = *(dp=new (buf) G10x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y3)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(36,24), "G10x4y3");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(40,28), "G10x4y3");
    check_base_class_offset(lv, (C10*)(E10x4*), ABISELECT(16,8), "G10x4y3");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(28,16), "G10x4y3");
    check_base_class_offset(lv, (E10x4*), ABISELECT(16,8), "G10x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G10x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x4y3.ff");
    test_class_info(&lv, &cd_G10x4y3);
    dp->~G10x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y3(Test_G10x4y3, "G10x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G10x4y3C1Ev();
extern void _ZN7G10x4y3D1Ev();
Name_Map name_map_G10x4y3[] = {
  NSPAIR(_ZN7G10x4y3C1Ev),
  NSPAIR(_ZN7G10x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y3[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x4y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G10x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x4y3[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y3[] = {
  {&(_ZTV7G10x4y3[6]),  6,14},
  {&(_ZTV7G10x4y3[10]),  10,14},
  {&(_ZTV7G10x4y3[13]),  13,14},
  {&(_tg__ZTV5E10x4__7G10x4y3[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y3[];
extern  VTBL_ENTRY _ZTV7G10x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y3[];
Class_Descriptor cd_G10x4y3 = {  "G10x4y3", // class name
  bases_G10x4y3, 6,
  &(vtc_G10x4y3[0]), // expected_vtbl_contents
  &(vtt_G10x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G10x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y3),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y4  : E10x4 , F0 {
  int ff;
  ~G10x4y4(); // tgen
  G10x4y4(); // tgen
};
//SIG(1 G10x4y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G10x4y4 ::~G10x4y4(){ note_dtor("G10x4y4", this);} // tgen
G10x4y4 ::G10x4y4(){ note_ctor("G10x4y4", this);} // tgen

static void Test_G10x4y4()
{
  extern Class_Descriptor cd_G10x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x4y4, buf);
    G10x4y4 *dp, &lv = *(dp=new (buf) G10x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y4)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(28,24), "G10x4y4");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(32,28), "G10x4y4");
    check_base_class_offset(lv, (C10*)(E10x4*), 0, "G10x4y4");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(12,8), "G10x4y4");
    check_base_class_offset(lv, (E10x4*), 0, "G10x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G10x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G10x4y4.ff");
    test_class_info(&lv, &cd_G10x4y4);
    dp->~G10x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y4(Test_G10x4y4, "G10x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G10x4y4C1Ev();
extern void _ZN7G10x4y4D1Ev();
Name_Map name_map_G10x4y4[] = {
  NSPAIR(_ZN7G10x4y4C1Ev),
  NSPAIR(_ZN7G10x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y4[];
static  VTBL_ENTRY vtc_G10x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y4[0]),
};
extern VTBL_ENTRY _ZTV7G10x4y4[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y4[] = {
  {&(_ZTV7G10x4y4[4]),  4,4},
  {&(_tg__ZTV5E10x4__7G10x4y4[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y4[];
extern  VTBL_ENTRY _ZTV7G10x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y4[];
Class_Descriptor cd_G10x4y4 = {  "G10x4y4", // class name
  bases_G10x4y4, 6,
  &(vtc_G10x4y4[0]), // expected_vtbl_contents
  &(vtt_G10x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G10x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y4),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y5  : virtual E10x4 , F0 {
  int ff;
  ~G10x4y5(); // tgen
  G10x4y5(); // tgen
};
//SIG(1 G10x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G10x4y5 ::~G10x4y5(){ note_dtor("G10x4y5", this);} // tgen
G10x4y5 ::G10x4y5(){ note_ctor("G10x4y5", this);} // tgen

static void Test_G10x4y5()
{
  extern Class_Descriptor cd_G10x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x4y5, buf);
    G10x4y5 *dp, &lv = *(dp=new (buf) G10x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y5)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(36,28), "G10x4y5");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(40,32), "G10x4y5");
    check_base_class_offset(lv, (C10*)(E10x4*), ABISELECT(16,12), "G10x4y5");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(28,20), "G10x4y5");
    check_base_class_offset(lv, (E10x4*), ABISELECT(16,12), "G10x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x4y5.ff");
    test_class_info(&lv, &cd_G10x4y5);
    dp->~G10x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y5(Test_G10x4y5, "G10x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x4y5C1Ev();
extern void _ZN7G10x4y5D1Ev();
Name_Map name_map_G10x4y5[] = {
  NSPAIR(_ZN7G10x4y5C1Ev),
  NSPAIR(_ZN7G10x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y5[];
static  VTBL_ENTRY vtc_G10x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y5[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x4y5[0]),
};
extern VTBL_ENTRY _ZTV7G10x4y5[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y5[] = {
  {&(_ZTV7G10x4y5[5]),  5,9},
  {&(_ZTV7G10x4y5[9]),  9,9},
  {&(_tg__ZTV5E10x4__7G10x4y5[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y5[];
extern  VTBL_ENTRY _ZTV7G10x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y5[];
Class_Descriptor cd_G10x4y5 = {  "G10x4y5", // class name
  bases_G10x4y5, 6,
  &(vtc_G10x4y5[0]), // expected_vtbl_contents
  &(vtt_G10x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y5),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y6  : E10x4 , virtual F0 {
  int ff;
  ~G10x4y6(); // tgen
  G10x4y6(); // tgen
};
//SIG(1 G10x4y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x4y6 ::~G10x4y6(){ note_dtor("G10x4y6", this);} // tgen
G10x4y6 ::G10x4y6(){ note_ctor("G10x4y6", this);} // tgen

static void Test_G10x4y6()
{
  extern Class_Descriptor cd_G10x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x4y6, buf);
    G10x4y6 *dp, &lv = *(dp=new (buf) G10x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y6)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(24,20), "G10x4y6");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(28,24), "G10x4y6");
    check_base_class_offset(lv, (C10*)(E10x4*), 0, "G10x4y6");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(12,8), "G10x4y6");
    check_base_class_offset(lv, (E10x4*), 0, "G10x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G10x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x4y6.ff");
    test_class_info(&lv, &cd_G10x4y6);
    dp->~G10x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y6(Test_G10x4y6, "G10x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G10x4y6C1Ev();
extern void _ZN7G10x4y6D1Ev();
Name_Map name_map_G10x4y6[] = {
  NSPAIR(_ZN7G10x4y6C1Ev),
  NSPAIR(_ZN7G10x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y6[];
static  VTBL_ENTRY vtc_G10x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y6[0]),
};
extern VTBL_ENTRY _ZTV7G10x4y6[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y6[] = {
  {&(_ZTV7G10x4y6[5]),  5,5},
  {&(_tg__ZTV5E10x4__7G10x4y6[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y6[];
extern  VTBL_ENTRY _ZTV7G10x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y6[];
Class_Descriptor cd_G10x4y6 = {  "G10x4y6", // class name
  bases_G10x4y6, 6,
  &(vtc_G10x4y6[0]), // expected_vtbl_contents
  &(vtt_G10x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G10x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y6),5, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x4y7  : virtual E10x4 , virtual F0 {
  int ff;
  ~G10x4y7(); // tgen
  G10x4y7(); // tgen
};
//SIG(1 G10x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x4y7 ::~G10x4y7(){ note_dtor("G10x4y7", this);} // tgen
G10x4y7 ::G10x4y7(){ note_ctor("G10x4y7", this);} // tgen

static void Test_G10x4y7()
{
  extern Class_Descriptor cd_G10x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x4y7, buf);
    G10x4y7 *dp, &lv = *(dp=new (buf) G10x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x4y7)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x4*), ABISELECT(36,24), "G10x4y7");
    check_base_class_offset(lv, (B0*)(C10*)(E10x4*), ABISELECT(40,28), "G10x4y7");
    check_base_class_offset(lv, (C10*)(E10x4*), ABISELECT(16,8), "G10x4y7");
    check_base_class_offset(lv, (D0*)(E10x4*), ABISELECT(28,16), "G10x4y7");
    check_base_class_offset(lv, (E10x4*), ABISELECT(16,8), "G10x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G10x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x4y7.ff");
    test_class_info(&lv, &cd_G10x4y7);
    dp->~G10x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x4y7(Test_G10x4y7, "G10x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x4y7C1Ev();
extern void _ZN7G10x4y7D1Ev();
Name_Map name_map_G10x4y7[] = {
  NSPAIR(_ZN7G10x4y7C1Ev),
  NSPAIR(_ZN7G10x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x4;
extern VTBL_ENTRY _ZTI5E10x4[];
extern  VTBL_ENTRY _ZTV5E10x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x4y7[];
static  VTBL_ENTRY vtc_G10x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x4y7[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x4y7[0]),
};
extern VTBL_ENTRY _ZTV7G10x4y7[];
static  VTBL_ENTRY _tg__ZTV5E10x4__7G10x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x4__7G10x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x4y7[] = {
  {&(_ZTV7G10x4y7[6]),  6,10},
  {&(_ZTV7G10x4y7[10]),  10,10},
  {&(_tg__ZTV5E10x4__7G10x4y7[4]),  4,4},
  {&(_tg__ZTV3C105E10x4__7G10x4y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x4y7[];
extern  VTBL_ENTRY _ZTV7G10x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x4y7[];
Class_Descriptor cd_G10x4y7 = {  "G10x4y7", // class name
  bases_G10x4y7, 6,
  &(vtc_G10x4y7[0]), // expected_vtbl_contents
  &(vtt_G10x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x4y7),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x4y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E11x4  : C11 , D0 {
  int fd;
  ~E11x4(); // tgen
  E11x4(); // tgen
};
//SIG(-1 E11x4) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E11x4 ::~E11x4(){ note_dtor("E11x4", this);} // tgen
E11x4 ::E11x4(){ note_ctor("E11x4", this);} // tgen

static void Test_E11x4()
{
  extern Class_Descriptor cd_E11x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E11x4, buf);
    E11x4 *dp, &lv = *(dp=new (buf) E11x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E11x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x4)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(24,16), "E11x4");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(36,24), "E11x4");
    check_base_class_offset(lv, (C11*), 0, "E11x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E11x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E11x4.fd");
    test_class_info(&lv, &cd_E11x4);
    dp->~E11x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x4(Test_E11x4, "E11x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E11x4C1Ev();
extern void _ZN5E11x4D1Ev();
Name_Map name_map_E11x4[] = {
  NSPAIR(_ZN5E11x4C1Ev),
  NSPAIR(_ZN5E11x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E11x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E11x4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E11x4[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV5E11x4[];
static  VTBL_ENTRY _tg__ZTV3C11__5E11x4[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__5E11x4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x4[] = {
  {&(_ZTV5E11x4[4]),  4,8},
  {&(_tg__ZTV3C11__5E11x4[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__5E11x4[3]),  3,4},
  {&(_ZTV5E11x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
Class_Descriptor cd_E11x4 = {  "E11x4", // class name
  bases_E11x4, 4,
  &(vtc_E11x4[0]), // expected_vtbl_contents
  &(vtt_E11x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E11x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E11x4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E11x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y0  : E11x4 , F1 {
  int ff;
  ~G11x4y0(); // tgen
  G11x4y0(); // tgen
};
//SIG(1 G11x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x4y0 ::~G11x4y0(){ note_dtor("G11x4y0", this);} // tgen
G11x4y0 ::G11x4y0(){ note_ctor("G11x4y0", this);} // tgen

static void Test_G11x4y0()
{
  extern Class_Descriptor cd_G11x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x4y0, buf);
    G11x4y0 *dp, &lv = *(dp=new (buf) G11x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y0)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(40,28), "G11x4y0");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(52,36), "G11x4y0");
    check_base_class_offset(lv, (C11*)(E11x4*), 0, "G11x4y0");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(12,8), "G11x4y0");
    check_base_class_offset(lv, (E11x4*), 0, "G11x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G11x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G11x4y0.ff");
    test_class_info(&lv, &cd_G11x4y0);
    dp->~G11x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y0(Test_G11x4y0, "G11x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x4y0C1Ev();
extern void _ZN7G11x4y0D1Ev();
Name_Map name_map_G11x4y0[] = {
  NSPAIR(_ZN7G11x4y0C1Ev),
  NSPAIR(_ZN7G11x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x4y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G11x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G11x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y0[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y0[] = {
  {&(_ZTV7G11x4y0[4]),  4,11},
  {&(_tg__ZTV5E11x4__7G11x4y0[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y0[3]),  3,4},
  {&(_ZTV7G11x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G11x4y0[];
extern  VTBL_ENTRY _ZTV7G11x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y0[];
Class_Descriptor cd_G11x4y0 = {  "G11x4y0", // class name
  bases_G11x4y0, 6,
  &(vtc_G11x4y0[0]), // expected_vtbl_contents
  &(vtt_G11x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y1  : virtual E11x4 , F1 {
  int ff;
  ~G11x4y1(); // tgen
  G11x4y1(); // tgen
};
//SIG(1 G11x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x4y1 ::~G11x4y1(){ note_dtor("G11x4y1", this);} // tgen
G11x4y1 ::G11x4y1(){ note_ctor("G11x4y1", this);} // tgen

static void Test_G11x4y1()
{
  extern Class_Descriptor cd_G11x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x4y1, buf);
    G11x4y1 *dp, &lv = *(dp=new (buf) G11x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y1)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(40,28), "G11x4y1");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(52,36), "G11x4y1");
    check_base_class_offset(lv, (C11*)(E11x4*), ABISELECT(16,12), "G11x4y1");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(28,20), "G11x4y1");
    check_base_class_offset(lv, (E11x4*), ABISELECT(16,12), "G11x4y1");
    check_base_class_offset(lv, (F1*), 0, "G11x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x4y1.ff");
    test_class_info(&lv, &cd_G11x4y1);
    dp->~G11x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y1(Test_G11x4y1, "G11x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x4y1C1Ev();
extern void _ZN7G11x4y1D1Ev();
Name_Map name_map_G11x4y1[] = {
  NSPAIR(_ZN7G11x4y1C1Ev),
  NSPAIR(_ZN7G11x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x4y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x4y1[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G11x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y1[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y1[] = {
  {&(_ZTV7G11x4y1[5]),  5,14},
  {&(_ZTV7G11x4y1[10]),  10,14},
  {&(_ZTV7G11x4y1[13]),  13,14},
  {&(_tg__ZTV5E11x4__7G11x4y1[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x4y1[];
extern  VTBL_ENTRY _ZTV7G11x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y1[];
Class_Descriptor cd_G11x4y1 = {  "G11x4y1", // class name
  bases_G11x4y1, 6,
  &(vtc_G11x4y1[0]), // expected_vtbl_contents
  &(vtt_G11x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y2  : E11x4 , virtual F1 {
  int ff;
  ~G11x4y2(); // tgen
  G11x4y2(); // tgen
};
//SIG(1 G11x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x4y2 ::~G11x4y2(){ note_dtor("G11x4y2", this);} // tgen
G11x4y2 ::G11x4y2(){ note_ctor("G11x4y2", this);} // tgen

static void Test_G11x4y2()
{
  extern Class_Descriptor cd_G11x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x4y2, buf);
    G11x4y2 *dp, &lv = *(dp=new (buf) G11x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y2)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(24,20), "G11x4y2");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(36,28), "G11x4y2");
    check_base_class_offset(lv, (C11*)(E11x4*), 0, "G11x4y2");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(12,8), "G11x4y2");
    check_base_class_offset(lv, (E11x4*), 0, "G11x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G11x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x4y2.ff");
    test_class_info(&lv, &cd_G11x4y2);
    dp->~G11x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y2(Test_G11x4y2, "G11x4y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x4y2C1Ev();
extern void _ZN7G11x4y2D1Ev();
Name_Map name_map_G11x4y2[] = {
  NSPAIR(_ZN7G11x4y2C1Ev),
  NSPAIR(_ZN7G11x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x4y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y2[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G11x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G11x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y2[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y2[] = {
  {&(_ZTV7G11x4y2[5]),  5,13},
  {&(_tg__ZTV5E11x4__7G11x4y2[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y2[3]),  3,4},
  {&(_ZTV7G11x4y2[8]),  8,13},
  {&(_ZTV7G11x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G11x4y2[];
extern  VTBL_ENTRY _ZTV7G11x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y2[];
Class_Descriptor cd_G11x4y2 = {  "G11x4y2", // class name
  bases_G11x4y2, 6,
  &(vtc_G11x4y2[0]), // expected_vtbl_contents
  &(vtt_G11x4y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y3  : virtual E11x4 , virtual F1 {
  int ff;
  ~G11x4y3(); // tgen
  G11x4y3(); // tgen
};
//SIG(1 G11x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x4y3 ::~G11x4y3(){ note_dtor("G11x4y3", this);} // tgen
G11x4y3 ::G11x4y3(){ note_ctor("G11x4y3", this);} // tgen

static void Test_G11x4y3()
{
  extern Class_Descriptor cd_G11x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x4y3, buf);
    G11x4y3 *dp, &lv = *(dp=new (buf) G11x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y3)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(40,24), "G11x4y3");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(52,32), "G11x4y3");
    check_base_class_offset(lv, (C11*)(E11x4*), ABISELECT(16,8), "G11x4y3");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(28,16), "G11x4y3");
    check_base_class_offset(lv, (E11x4*), ABISELECT(16,8), "G11x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x4y3.ff");
    test_class_info(&lv, &cd_G11x4y3);
    dp->~G11x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y3(Test_G11x4y3, "G11x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x4y3C1Ev();
extern void _ZN7G11x4y3D1Ev();
Name_Map name_map_G11x4y3[] = {
  NSPAIR(_ZN7G11x4y3C1Ev),
  NSPAIR(_ZN7G11x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y3[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x4y3[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G11x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G11x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y3[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y3[] = {
  {&(_ZTV7G11x4y3[6]),  6,18},
  {&(_ZTV7G11x4y3[10]),  10,18},
  {&(_ZTV7G11x4y3[13]),  13,18},
  {&(_ZTV7G11x4y3[17]),  17,18},
  {&(_tg__ZTV5E11x4__7G11x4y3[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x4y3[];
extern  VTBL_ENTRY _ZTV7G11x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y3[];
Class_Descriptor cd_G11x4y3 = {  "G11x4y3", // class name
  bases_G11x4y3, 6,
  &(vtc_G11x4y3[0]), // expected_vtbl_contents
  &(vtt_G11x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y4  : E11x4 , F0 {
  int ff;
  ~G11x4y4(); // tgen
  G11x4y4(); // tgen
};
//SIG(1 G11x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G11x4y4 ::~G11x4y4(){ note_dtor("G11x4y4", this);} // tgen
G11x4y4 ::G11x4y4(){ note_ctor("G11x4y4", this);} // tgen

static void Test_G11x4y4()
{
  extern Class_Descriptor cd_G11x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x4y4, buf);
    G11x4y4 *dp, &lv = *(dp=new (buf) G11x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y4)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(32,24), "G11x4y4");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(44,32), "G11x4y4");
    check_base_class_offset(lv, (C11*)(E11x4*), 0, "G11x4y4");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(12,8), "G11x4y4");
    check_base_class_offset(lv, (E11x4*), 0, "G11x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G11x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G11x4y4.ff");
    test_class_info(&lv, &cd_G11x4y4);
    dp->~G11x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y4(Test_G11x4y4, "G11x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G11x4y4C1Ev();
extern void _ZN7G11x4y4D1Ev();
Name_Map name_map_G11x4y4[] = {
  NSPAIR(_ZN7G11x4y4C1Ev),
  NSPAIR(_ZN7G11x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x4y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y4[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y4[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y4[] = {
  {&(_ZTV7G11x4y4[4]),  4,8},
  {&(_tg__ZTV5E11x4__7G11x4y4[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y4[3]),  3,4},
  {&(_ZTV7G11x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G11x4y4[];
extern  VTBL_ENTRY _ZTV7G11x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y4[];
Class_Descriptor cd_G11x4y4 = {  "G11x4y4", // class name
  bases_G11x4y4, 6,
  &(vtc_G11x4y4[0]), // expected_vtbl_contents
  &(vtt_G11x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G11x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y5  : virtual E11x4 , F0 {
  int ff;
  ~G11x4y5(); // tgen
  G11x4y5(); // tgen
};
//SIG(1 G11x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G11x4y5 ::~G11x4y5(){ note_dtor("G11x4y5", this);} // tgen
G11x4y5 ::G11x4y5(){ note_ctor("G11x4y5", this);} // tgen

static void Test_G11x4y5()
{
  extern Class_Descriptor cd_G11x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x4y5, buf);
    G11x4y5 *dp, &lv = *(dp=new (buf) G11x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y5)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(40,28), "G11x4y5");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(52,36), "G11x4y5");
    check_base_class_offset(lv, (C11*)(E11x4*), ABISELECT(16,12), "G11x4y5");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(28,20), "G11x4y5");
    check_base_class_offset(lv, (E11x4*), ABISELECT(16,12), "G11x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x4y5.ff");
    test_class_info(&lv, &cd_G11x4y5);
    dp->~G11x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y5(Test_G11x4y5, "G11x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x4y5C1Ev();
extern void _ZN7G11x4y5D1Ev();
Name_Map name_map_G11x4y5[] = {
  NSPAIR(_ZN7G11x4y5C1Ev),
  NSPAIR(_ZN7G11x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x4y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y5[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x4y5[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G11x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y5[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y5[] = {
  {&(_ZTV7G11x4y5[5]),  5,13},
  {&(_ZTV7G11x4y5[9]),  9,13},
  {&(_ZTV7G11x4y5[12]),  12,13},
  {&(_tg__ZTV5E11x4__7G11x4y5[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x4y5[];
extern  VTBL_ENTRY _ZTV7G11x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y5[];
Class_Descriptor cd_G11x4y5 = {  "G11x4y5", // class name
  bases_G11x4y5, 6,
  &(vtc_G11x4y5[0]), // expected_vtbl_contents
  &(vtt_G11x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y6  : E11x4 , virtual F0 {
  int ff;
  ~G11x4y6(); // tgen
  G11x4y6(); // tgen
};
//SIG(1 G11x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x4y6 ::~G11x4y6(){ note_dtor("G11x4y6", this);} // tgen
G11x4y6 ::G11x4y6(){ note_ctor("G11x4y6", this);} // tgen

static void Test_G11x4y6()
{
  extern Class_Descriptor cd_G11x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x4y6, buf);
    G11x4y6 *dp, &lv = *(dp=new (buf) G11x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y6)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(24,20), "G11x4y6");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(36,28), "G11x4y6");
    check_base_class_offset(lv, (C11*)(E11x4*), 0, "G11x4y6");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(12,8), "G11x4y6");
    check_base_class_offset(lv, (E11x4*), 0, "G11x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G11x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x4y6.ff");
    test_class_info(&lv, &cd_G11x4y6);
    dp->~G11x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y6(Test_G11x4y6, "G11x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G11x4y6C1Ev();
extern void _ZN7G11x4y6D1Ev();
Name_Map name_map_G11x4y6[] = {
  NSPAIR(_ZN7G11x4y6C1Ev),
  NSPAIR(_ZN7G11x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x4y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y6[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G11x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y6[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y6[] = {
  {&(_ZTV7G11x4y6[5]),  5,9},
  {&(_tg__ZTV5E11x4__7G11x4y6[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y6[3]),  3,4},
  {&(_ZTV7G11x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G11x4y6[];
extern  VTBL_ENTRY _ZTV7G11x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y6[];
Class_Descriptor cd_G11x4y6 = {  "G11x4y6", // class name
  bases_G11x4y6, 6,
  &(vtc_G11x4y6[0]), // expected_vtbl_contents
  &(vtt_G11x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G11x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x4y7  : virtual E11x4 , virtual F0 {
  int ff;
  ~G11x4y7(); // tgen
  G11x4y7(); // tgen
};
//SIG(1 G11x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x4y7 ::~G11x4y7(){ note_dtor("G11x4y7", this);} // tgen
G11x4y7 ::G11x4y7(){ note_ctor("G11x4y7", this);} // tgen

static void Test_G11x4y7()
{
  extern Class_Descriptor cd_G11x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x4y7, buf);
    G11x4y7 *dp, &lv = *(dp=new (buf) G11x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x4y7)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x4*), ABISELECT(40,24), "G11x4y7");
    check_base_class_offset(lv, (B0*)(C11*)(E11x4*), ABISELECT(52,32), "G11x4y7");
    check_base_class_offset(lv, (C11*)(E11x4*), ABISELECT(16,8), "G11x4y7");
    check_base_class_offset(lv, (D0*)(E11x4*), ABISELECT(28,16), "G11x4y7");
    check_base_class_offset(lv, (E11x4*), ABISELECT(16,8), "G11x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G11x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x4y7.ff");
    test_class_info(&lv, &cd_G11x4y7);
    dp->~G11x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x4y7(Test_G11x4y7, "G11x4y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G11x4y7C1Ev();
extern void _ZN7G11x4y7D1Ev();
Name_Map name_map_G11x4y7[] = {
  NSPAIR(_ZN7G11x4y7C1Ev),
  NSPAIR(_ZN7G11x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x4;
extern VTBL_ENTRY _ZTI5E11x4[];
extern  VTBL_ENTRY _ZTV5E11x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x4y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x4y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x4y7[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x4y7[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G11x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x4y7[];
static  VTBL_ENTRY _tg__ZTV5E11x4__7G11x4y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x4__7G11x4y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x4__7G11x4y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x4__7G11x4y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x4y7[] = {
  {&(_ZTV7G11x4y7[6]),  6,14},
  {&(_ZTV7G11x4y7[10]),  10,14},
  {&(_ZTV7G11x4y7[13]),  13,14},
  {&(_tg__ZTV5E11x4__7G11x4y7[4]),  4,4},
  {&(_tg__ZTV3C115E11x4__7G11x4y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x4__7G11x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x4__7G11x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x4y7[];
extern  VTBL_ENTRY _ZTV7G11x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x4y7[];
Class_Descriptor cd_G11x4y7 = {  "G11x4y7", // class name
  bases_G11x4y7, 6,
  &(vtc_G11x4y7[0]), // expected_vtbl_contents
  &(vtt_G11x4y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G11x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x4y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E12x4  : C12 , D0 {
  int fd;
  ~E12x4(); // tgen
  E12x4(); // tgen
};
//SIG(-1 E12x4) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E12x4 ::~E12x4(){ note_dtor("E12x4", this);} // tgen
E12x4 ::E12x4(){ note_ctor("E12x4", this);} // tgen

static void Test_E12x4()
{
  extern Class_Descriptor cd_E12x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E12x4, buf);
    E12x4 *dp, &lv = *(dp=new (buf) E12x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E12x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x4)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(8,4), "E12x4");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(24,20), "E12x4");
    check_base_class_offset(lv, (C12*), 0, "E12x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E12x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E12x4.fd");
    test_class_info(&lv, &cd_E12x4);
    dp->~E12x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x4(Test_E12x4, "E12x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E12x4C1Ev();
extern void _ZN5E12x4D1Ev();
Name_Map name_map_E12x4[] = {
  NSPAIR(_ZN5E12x4C1Ev),
  NSPAIR(_ZN5E12x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E12x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E12x4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E12x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E12x4[];
static  VTBL_ENTRY _tg__ZTV3C12__5E12x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__5E12x4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x4[] = {
  {&(_ZTV5E12x4[3]),  3,7},
  {&(_tg__ZTV3C12__5E12x4[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__5E12x4[3]),  3,4},
  {&(_ZTV5E12x4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
Class_Descriptor cd_E12x4 = {  "E12x4", // class name
  bases_E12x4, 4,
  &(vtc_E12x4[0]), // expected_vtbl_contents
  &(vtt_E12x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E12x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E12x4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E12x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y0  : E12x4 , F1 {
  int ff;
  ~G12x4y0(); // tgen
  G12x4y0(); // tgen
};
//SIG(1 G12x4y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x4y0 ::~G12x4y0(){ note_dtor("G12x4y0", this);} // tgen
G12x4y0 ::G12x4y0(){ note_ctor("G12x4y0", this);} // tgen

static void Test_G12x4y0()
{
  extern Class_Descriptor cd_G12x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x4y0, buf);
    G12x4y0 *dp, &lv = *(dp=new (buf) G12x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y0)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(8,4), "G12x4y0");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(40,32), "G12x4y0");
    check_base_class_offset(lv, (C12*)(E12x4*), 0, "G12x4y0");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(16,12), "G12x4y0");
    check_base_class_offset(lv, (E12x4*), 0, "G12x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G12x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G12x4y0.ff");
    test_class_info(&lv, &cd_G12x4y0);
    dp->~G12x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y0(Test_G12x4y0, "G12x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x4y0C1Ev();
extern void _ZN7G12x4y0D1Ev();
Name_Map name_map_G12x4y0[] = {
  NSPAIR(_ZN7G12x4y0C1Ev),
  NSPAIR(_ZN7G12x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y0[0]),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G12x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G12x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y0[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y0[] = {
  {&(_ZTV7G12x4y0[3]),  3,10},
  {&(_tg__ZTV5E12x4__7G12x4y0[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y0[3]),  3,4},
  {&(_ZTV7G12x4y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G12x4y0[];
extern  VTBL_ENTRY _ZTV7G12x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y0[];
Class_Descriptor cd_G12x4y0 = {  "G12x4y0", // class name
  bases_G12x4y0, 6,
  &(vtc_G12x4y0[0]), // expected_vtbl_contents
  &(vtt_G12x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y1  : virtual E12x4 , F1 {
  int ff;
  ~G12x4y1(); // tgen
  G12x4y1(); // tgen
};
//SIG(1 G12x4y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x4y1 ::~G12x4y1(){ note_dtor("G12x4y1", this);} // tgen
G12x4y1 ::G12x4y1(){ note_ctor("G12x4y1", this);} // tgen

static void Test_G12x4y1()
{
  extern Class_Descriptor cd_G12x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x4y1, buf);
    G12x4y1 *dp, &lv = *(dp=new (buf) G12x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y1)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(24,16), "G12x4y1");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(40,32), "G12x4y1");
    check_base_class_offset(lv, (C12*)(E12x4*), ABISELECT(16,12), "G12x4y1");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(32,24), "G12x4y1");
    check_base_class_offset(lv, (E12x4*), ABISELECT(16,12), "G12x4y1");
    check_base_class_offset(lv, (F1*), 0, "G12x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x4y1.ff");
    test_class_info(&lv, &cd_G12x4y1);
    dp->~G12x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y1(Test_G12x4y1, "G12x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x4y1C1Ev();
extern void _ZN7G12x4y1D1Ev();
Name_Map name_map_G12x4y1[] = {
  NSPAIR(_ZN7G12x4y1C1Ev),
  NSPAIR(_ZN7G12x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x4y1[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G12x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y1[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y1[] = {
  {&(_ZTV7G12x4y1[4]),  4,12},
  {&(_ZTV7G12x4y1[8]),  8,12},
  {&(_ZTV7G12x4y1[11]),  11,12},
  {&(_tg__ZTV5E12x4__7G12x4y1[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x4y1[];
extern  VTBL_ENTRY _ZTV7G12x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y1[];
Class_Descriptor cd_G12x4y1 = {  "G12x4y1", // class name
  bases_G12x4y1, 6,
  &(vtc_G12x4y1[0]), // expected_vtbl_contents
  &(vtt_G12x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y2  : E12x4 , virtual F1 {
  int ff;
  ~G12x4y2(); // tgen
  G12x4y2(); // tgen
};
//SIG(1 G12x4y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x4y2 ::~G12x4y2(){ note_dtor("G12x4y2", this);} // tgen
G12x4y2 ::G12x4y2(){ note_ctor("G12x4y2", this);} // tgen

static void Test_G12x4y2()
{
  extern Class_Descriptor cd_G12x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G12x4y2, buf);
    G12x4y2 *dp, &lv = *(dp=new (buf) G12x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G12x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y2)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(8,4), "G12x4y2");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(32,24), "G12x4y2");
    check_base_class_offset(lv, (C12*)(E12x4*), 0, "G12x4y2");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(16,12), "G12x4y2");
    check_base_class_offset(lv, (E12x4*), 0, "G12x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G12x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G12x4y2.ff");
    test_class_info(&lv, &cd_G12x4y2);
    dp->~G12x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y2(Test_G12x4y2, "G12x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G12x4y2C1Ev();
extern void _ZN7G12x4y2D1Ev();
Name_Map name_map_G12x4y2[] = {
  NSPAIR(_ZN7G12x4y2C1Ev),
  NSPAIR(_ZN7G12x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y2[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G12x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y2[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y2[] = {
  {&(_ZTV7G12x4y2[4]),  4,12},
  {&(_tg__ZTV5E12x4__7G12x4y2[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y2[3]),  3,4},
  {&(_ZTV7G12x4y2[7]),  7,12},
  {&(_ZTV7G12x4y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G12x4y2[];
extern  VTBL_ENTRY _ZTV7G12x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y2[];
Class_Descriptor cd_G12x4y2 = {  "G12x4y2", // class name
  bases_G12x4y2, 6,
  &(vtc_G12x4y2[0]), // expected_vtbl_contents
  &(vtt_G12x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G12x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y3  : virtual E12x4 , virtual F1 {
  int ff;
  ~G12x4y3(); // tgen
  G12x4y3(); // tgen
};
//SIG(1 G12x4y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x4y3 ::~G12x4y3(){ note_dtor("G12x4y3", this);} // tgen
G12x4y3 ::G12x4y3(){ note_ctor("G12x4y3", this);} // tgen

static void Test_G12x4y3()
{
  extern Class_Descriptor cd_G12x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x4y3, buf);
    G12x4y3 *dp, &lv = *(dp=new (buf) G12x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y3)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(24,12), "G12x4y3");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(40,28), "G12x4y3");
    check_base_class_offset(lv, (C12*)(E12x4*), ABISELECT(16,8), "G12x4y3");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(32,20), "G12x4y3");
    check_base_class_offset(lv, (E12x4*), ABISELECT(16,8), "G12x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G12x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x4y3.ff");
    test_class_info(&lv, &cd_G12x4y3);
    dp->~G12x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y3(Test_G12x4y3, "G12x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G12x4y3C1Ev();
extern void _ZN7G12x4y3D1Ev();
Name_Map name_map_G12x4y3[] = {
  NSPAIR(_ZN7G12x4y3C1Ev),
  NSPAIR(_ZN7G12x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y3[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x4y3[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G12x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y3[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y3[] = {
  {&(_ZTV7G12x4y3[5]),  5,16},
  {&(_ZTV7G12x4y3[8]),  8,16},
  {&(_ZTV7G12x4y3[11]),  11,16},
  {&(_ZTV7G12x4y3[15]),  15,16},
  {&(_tg__ZTV5E12x4__7G12x4y3[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x4y3[];
extern  VTBL_ENTRY _ZTV7G12x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y3[];
Class_Descriptor cd_G12x4y3 = {  "G12x4y3", // class name
  bases_G12x4y3, 6,
  &(vtc_G12x4y3[0]), // expected_vtbl_contents
  &(vtt_G12x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G12x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y4  : E12x4 , F0 {
  int ff;
  ~G12x4y4(); // tgen
  G12x4y4(); // tgen
};
//SIG(1 G12x4y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G12x4y4 ::~G12x4y4(){ note_dtor("G12x4y4", this);} // tgen
G12x4y4 ::G12x4y4(){ note_ctor("G12x4y4", this);} // tgen

static void Test_G12x4y4()
{
  extern Class_Descriptor cd_G12x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x4y4, buf);
    G12x4y4 *dp, &lv = *(dp=new (buf) G12x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y4)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(8,4), "G12x4y4");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(32,28), "G12x4y4");
    check_base_class_offset(lv, (C12*)(E12x4*), 0, "G12x4y4");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(16,12), "G12x4y4");
    check_base_class_offset(lv, (E12x4*), 0, "G12x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G12x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G12x4y4.ff");
    test_class_info(&lv, &cd_G12x4y4);
    dp->~G12x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y4(Test_G12x4y4, "G12x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G12x4y4C1Ev();
extern void _ZN7G12x4y4D1Ev();
Name_Map name_map_G12x4y4[] = {
  NSPAIR(_ZN7G12x4y4C1Ev),
  NSPAIR(_ZN7G12x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,28), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y4[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G12x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y4[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y4[] = {
  {&(_ZTV7G12x4y4[3]),  3,7},
  {&(_tg__ZTV5E12x4__7G12x4y4[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y4[3]),  3,4},
  {&(_ZTV7G12x4y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G12x4y4[];
extern  VTBL_ENTRY _ZTV7G12x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y4[];
Class_Descriptor cd_G12x4y4 = {  "G12x4y4", // class name
  bases_G12x4y4, 6,
  &(vtc_G12x4y4[0]), // expected_vtbl_contents
  &(vtt_G12x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G12x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y5  : virtual E12x4 , F0 {
  int ff;
  ~G12x4y5(); // tgen
  G12x4y5(); // tgen
};
//SIG(1 G12x4y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G12x4y5 ::~G12x4y5(){ note_dtor("G12x4y5", this);} // tgen
G12x4y5 ::G12x4y5(){ note_ctor("G12x4y5", this);} // tgen

static void Test_G12x4y5()
{
  extern Class_Descriptor cd_G12x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x4y5, buf);
    G12x4y5 *dp, &lv = *(dp=new (buf) G12x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y5)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(24,16), "G12x4y5");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(40,32), "G12x4y5");
    check_base_class_offset(lv, (C12*)(E12x4*), ABISELECT(16,12), "G12x4y5");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(32,24), "G12x4y5");
    check_base_class_offset(lv, (E12x4*), ABISELECT(16,12), "G12x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x4y5.ff");
    test_class_info(&lv, &cd_G12x4y5);
    dp->~G12x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y5(Test_G12x4y5, "G12x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x4y5C1Ev();
extern void _ZN7G12x4y5D1Ev();
Name_Map name_map_G12x4y5[] = {
  NSPAIR(_ZN7G12x4y5C1Ev),
  NSPAIR(_ZN7G12x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y5[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x4y5[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G12x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y5[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y5[] = {
  {&(_ZTV7G12x4y5[4]),  4,11},
  {&(_ZTV7G12x4y5[7]),  7,11},
  {&(_ZTV7G12x4y5[10]),  10,11},
  {&(_tg__ZTV5E12x4__7G12x4y5[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x4y5[];
extern  VTBL_ENTRY _ZTV7G12x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y5[];
Class_Descriptor cd_G12x4y5 = {  "G12x4y5", // class name
  bases_G12x4y5, 6,
  &(vtc_G12x4y5[0]), // expected_vtbl_contents
  &(vtt_G12x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y6  : E12x4 , virtual F0 {
  int ff;
  ~G12x4y6(); // tgen
  G12x4y6(); // tgen
};
//SIG(1 G12x4y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x4y6 ::~G12x4y6(){ note_dtor("G12x4y6", this);} // tgen
G12x4y6 ::G12x4y6(){ note_ctor("G12x4y6", this);} // tgen

static void Test_G12x4y6()
{
  extern Class_Descriptor cd_G12x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x4y6, buf);
    G12x4y6 *dp, &lv = *(dp=new (buf) G12x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y6)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(8,4), "G12x4y6");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(32,24), "G12x4y6");
    check_base_class_offset(lv, (C12*)(E12x4*), 0, "G12x4y6");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(16,12), "G12x4y6");
    check_base_class_offset(lv, (E12x4*), 0, "G12x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G12x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G12x4y6.ff");
    test_class_info(&lv, &cd_G12x4y6);
    dp->~G12x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y6(Test_G12x4y6, "G12x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G12x4y6C1Ev();
extern void _ZN7G12x4y6D1Ev();
Name_Map name_map_G12x4y6[] = {
  NSPAIR(_ZN7G12x4y6C1Ev),
  NSPAIR(_ZN7G12x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y6[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y6[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y6[] = {
  {&(_ZTV7G12x4y6[4]),  4,8},
  {&(_tg__ZTV5E12x4__7G12x4y6[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y6[3]),  3,4},
  {&(_ZTV7G12x4y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G12x4y6[];
extern  VTBL_ENTRY _ZTV7G12x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y6[];
Class_Descriptor cd_G12x4y6 = {  "G12x4y6", // class name
  bases_G12x4y6, 6,
  &(vtc_G12x4y6[0]), // expected_vtbl_contents
  &(vtt_G12x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G12x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x4y7  : virtual E12x4 , virtual F0 {
  int ff;
  ~G12x4y7(); // tgen
  G12x4y7(); // tgen
};
//SIG(1 G12x4y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x4y7 ::~G12x4y7(){ note_dtor("G12x4y7", this);} // tgen
G12x4y7 ::G12x4y7(){ note_ctor("G12x4y7", this);} // tgen

static void Test_G12x4y7()
{
  extern Class_Descriptor cd_G12x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x4y7, buf);
    G12x4y7 *dp, &lv = *(dp=new (buf) G12x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x4y7)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x4*), ABISELECT(24,12), "G12x4y7");
    check_base_class_offset(lv, (B1*)(C12*)(E12x4*), ABISELECT(40,28), "G12x4y7");
    check_base_class_offset(lv, (C12*)(E12x4*), ABISELECT(16,8), "G12x4y7");
    check_base_class_offset(lv, (D0*)(E12x4*), ABISELECT(32,20), "G12x4y7");
    check_base_class_offset(lv, (E12x4*), ABISELECT(16,8), "G12x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G12x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x4y7.ff");
    test_class_info(&lv, &cd_G12x4y7);
    dp->~G12x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x4y7(Test_G12x4y7, "G12x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x4y7C1Ev();
extern void _ZN7G12x4y7D1Ev();
Name_Map name_map_G12x4y7[] = {
  NSPAIR(_ZN7G12x4y7C1Ev),
  NSPAIR(_ZN7G12x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x4;
extern VTBL_ENTRY _ZTI5E12x4[];
extern  VTBL_ENTRY _ZTV5E12x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x4y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x4y7[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x4y7[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x4y7[];
static  VTBL_ENTRY _tg__ZTV5E12x4__7G12x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x4__7G12x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x4__7G12x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x4__7G12x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x4y7[] = {
  {&(_ZTV7G12x4y7[5]),  5,12},
  {&(_ZTV7G12x4y7[8]),  8,12},
  {&(_ZTV7G12x4y7[11]),  11,12},
  {&(_tg__ZTV5E12x4__7G12x4y7[3]),  3,3},
  {&(_tg__ZTV3C125E12x4__7G12x4y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x4__7G12x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x4__7G12x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x4y7[];
extern  VTBL_ENTRY _ZTV7G12x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x4y7[];
Class_Descriptor cd_G12x4y7 = {  "G12x4y7", // class name
  bases_G12x4y7, 6,
  &(vtc_G12x4y7[0]), // expected_vtbl_contents
  &(vtt_G12x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x4y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x4  : C13 , D0 {
  int fd;
  ~E13x4(); // tgen
  E13x4(); // tgen
};
//SIG(-1 E13x4) C1{ BC2{ BC3{ v1 Fi} VBC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E13x4 ::~E13x4(){ note_dtor("E13x4", this);} // tgen
E13x4 ::E13x4(){ note_ctor("E13x4", this);} // tgen

static void Test_E13x4()
{
  extern Class_Descriptor cd_E13x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E13x4, buf);
    E13x4 *dp, &lv = *(dp=new (buf) E13x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E13x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x4)");
    check_base_class_offset(lv, (A1*)(C13*), 0, "E13x4");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(24,20), "E13x4");
    check_base_class_offset(lv, (C13*), 0, "E13x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E13x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E13x4.fd");
    test_class_info(&lv, &cd_E13x4);
    dp->~E13x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x4(Test_E13x4, "E13x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E13x4C1Ev();
extern void _ZN5E13x4D1Ev();
Name_Map name_map_E13x4[] = {
  NSPAIR(_ZN5E13x4C1Ev),
  NSPAIR(_ZN5E13x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E13x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E13x4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E13x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E13x4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__5E13x4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x4[] = {
  {&(_ZTV5E13x4[3]),  3,8},
  {&(_tg__ZTV3C13__5E13x4[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__5E13x4[3]),  3,4},
  {&(_ZTV5E13x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
Class_Descriptor cd_E13x4 = {  "E13x4", // class name
  bases_E13x4, 4,
  &(vtc_E13x4[0]), // expected_vtbl_contents
  &(vtt_E13x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E13x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E13x4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E13x4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y0  : E13x4 , F1 {
  int ff;
  ~G13x4y0(); // tgen
  G13x4y0(); // tgen
};
//SIG(1 G13x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x4y0 ::~G13x4y0(){ note_dtor("G13x4y0", this);} // tgen
G13x4y0 ::G13x4y0(){ note_ctor("G13x4y0", this);} // tgen

static void Test_G13x4y0()
{
  extern Class_Descriptor cd_G13x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x4y0, buf);
    G13x4y0 *dp, &lv = *(dp=new (buf) G13x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y0)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), 0, "G13x4y0");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(40,32), "G13x4y0");
    check_base_class_offset(lv, (C13*)(E13x4*), 0, "G13x4y0");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(16,12), "G13x4y0");
    check_base_class_offset(lv, (E13x4*), 0, "G13x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G13x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G13x4y0.ff");
    test_class_info(&lv, &cd_G13x4y0);
    dp->~G13x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y0(Test_G13x4y0, "G13x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x4y0C1Ev();
extern void _ZN7G13x4y0D1Ev();
Name_Map name_map_G13x4y0[] = {
  NSPAIR(_ZN7G13x4y0C1Ev),
  NSPAIR(_ZN7G13x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y0[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G13x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G13x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y0[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y0[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y0[] = {
  {&(_ZTV7G13x4y0[3]),  3,11},
  {&(_tg__ZTV5E13x4__7G13x4y0[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y0[3]),  3,4},
  {&(_ZTV7G13x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G13x4y0[];
extern  VTBL_ENTRY _ZTV7G13x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y0[];
Class_Descriptor cd_G13x4y0 = {  "G13x4y0", // class name
  bases_G13x4y0, 6,
  &(vtc_G13x4y0[0]), // expected_vtbl_contents
  &(vtt_G13x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y1  : virtual E13x4 , F1 {
  int ff;
  ~G13x4y1(); // tgen
  G13x4y1(); // tgen
};
//SIG(1 G13x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x4y1 ::~G13x4y1(){ note_dtor("G13x4y1", this);} // tgen
G13x4y1 ::G13x4y1(){ note_ctor("G13x4y1", this);} // tgen

static void Test_G13x4y1()
{
  extern Class_Descriptor cd_G13x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x4y1, buf);
    G13x4y1 *dp, &lv = *(dp=new (buf) G13x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y1)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), ABISELECT(16,12), "G13x4y1");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(40,32), "G13x4y1");
    check_base_class_offset(lv, (C13*)(E13x4*), ABISELECT(16,12), "G13x4y1");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(32,24), "G13x4y1");
    check_base_class_offset(lv, (E13x4*), ABISELECT(16,12), "G13x4y1");
    check_base_class_offset(lv, (F1*), 0, "G13x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x4y1.ff");
    test_class_info(&lv, &cd_G13x4y1);
    dp->~G13x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y1(Test_G13x4y1, "G13x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x4y1C1Ev();
extern void _ZN7G13x4y1D1Ev();
Name_Map name_map_G13x4y1[] = {
  NSPAIR(_ZN7G13x4y1C1Ev),
  NSPAIR(_ZN7G13x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G13x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y1[] = {
  {&(_ZTV7G13x4y1[4]),  4,14},
  {&(_ZTV7G13x4y1[9]),  9,14},
  {&(_ZTV7G13x4y1[13]),  13,14},
  {&(_tg__ZTV5E13x4__7G13x4y1[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x4y1[];
extern  VTBL_ENTRY _ZTV7G13x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y1[];
Class_Descriptor cd_G13x4y1 = {  "G13x4y1", // class name
  bases_G13x4y1, 6,
  &(vtc_G13x4y1[0]), // expected_vtbl_contents
  &(vtt_G13x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y2  : E13x4 , virtual F1 {
  int ff;
  ~G13x4y2(); // tgen
  G13x4y2(); // tgen
};
//SIG(1 G13x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x4y2 ::~G13x4y2(){ note_dtor("G13x4y2", this);} // tgen
G13x4y2 ::G13x4y2(){ note_ctor("G13x4y2", this);} // tgen

static void Test_G13x4y2()
{
  extern Class_Descriptor cd_G13x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G13x4y2, buf);
    G13x4y2 *dp, &lv = *(dp=new (buf) G13x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G13x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y2)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), 0, "G13x4y2");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(32,24), "G13x4y2");
    check_base_class_offset(lv, (C13*)(E13x4*), 0, "G13x4y2");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(16,12), "G13x4y2");
    check_base_class_offset(lv, (E13x4*), 0, "G13x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G13x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G13x4y2.ff");
    test_class_info(&lv, &cd_G13x4y2);
    dp->~G13x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y2(Test_G13x4y2, "G13x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G13x4y2C1Ev();
extern void _ZN7G13x4y2D1Ev();
Name_Map name_map_G13x4y2[] = {
  NSPAIR(_ZN7G13x4y2C1Ev),
  NSPAIR(_ZN7G13x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G13x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y2[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y2[] = {
  {&(_ZTV7G13x4y2[4]),  4,13},
  {&(_tg__ZTV5E13x4__7G13x4y2[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y2[3]),  3,4},
  {&(_ZTV7G13x4y2[8]),  8,13},
  {&(_ZTV7G13x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G13x4y2[];
extern  VTBL_ENTRY _ZTV7G13x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y2[];
Class_Descriptor cd_G13x4y2 = {  "G13x4y2", // class name
  bases_G13x4y2, 6,
  &(vtc_G13x4y2[0]), // expected_vtbl_contents
  &(vtt_G13x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G13x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y3  : virtual E13x4 , virtual F1 {
  int ff;
  ~G13x4y3(); // tgen
  G13x4y3(); // tgen
};
//SIG(1 G13x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x4y3 ::~G13x4y3(){ note_dtor("G13x4y3", this);} // tgen
G13x4y3 ::G13x4y3(){ note_ctor("G13x4y3", this);} // tgen

static void Test_G13x4y3()
{
  extern Class_Descriptor cd_G13x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x4y3, buf);
    G13x4y3 *dp, &lv = *(dp=new (buf) G13x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y3)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), ABISELECT(16,8), "G13x4y3");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(40,28), "G13x4y3");
    check_base_class_offset(lv, (C13*)(E13x4*), ABISELECT(16,8), "G13x4y3");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(32,20), "G13x4y3");
    check_base_class_offset(lv, (E13x4*), ABISELECT(16,8), "G13x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G13x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x4y3.ff");
    test_class_info(&lv, &cd_G13x4y3);
    dp->~G13x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y3(Test_G13x4y3, "G13x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G13x4y3C1Ev();
extern void _ZN7G13x4y3D1Ev();
Name_Map name_map_G13x4y3[] = {
  NSPAIR(_ZN7G13x4y3C1Ev),
  NSPAIR(_ZN7G13x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G13x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y3[] = {
  {&(_ZTV7G13x4y3[5]),  5,18},
  {&(_ZTV7G13x4y3[9]),  9,18},
  {&(_ZTV7G13x4y3[13]),  13,18},
  {&(_ZTV7G13x4y3[17]),  17,18},
  {&(_tg__ZTV5E13x4__7G13x4y3[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x4y3[];
extern  VTBL_ENTRY _ZTV7G13x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y3[];
Class_Descriptor cd_G13x4y3 = {  "G13x4y3", // class name
  bases_G13x4y3, 6,
  &(vtc_G13x4y3[0]), // expected_vtbl_contents
  &(vtt_G13x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G13x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y4  : E13x4 , F0 {
  int ff;
  ~G13x4y4(); // tgen
  G13x4y4(); // tgen
};
//SIG(1 G13x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G13x4y4 ::~G13x4y4(){ note_dtor("G13x4y4", this);} // tgen
G13x4y4 ::G13x4y4(){ note_ctor("G13x4y4", this);} // tgen

static void Test_G13x4y4()
{
  extern Class_Descriptor cd_G13x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x4y4, buf);
    G13x4y4 *dp, &lv = *(dp=new (buf) G13x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y4)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), 0, "G13x4y4");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(32,28), "G13x4y4");
    check_base_class_offset(lv, (C13*)(E13x4*), 0, "G13x4y4");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(16,12), "G13x4y4");
    check_base_class_offset(lv, (E13x4*), 0, "G13x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G13x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G13x4y4.ff");
    test_class_info(&lv, &cd_G13x4y4);
    dp->~G13x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y4(Test_G13x4y4, "G13x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G13x4y4C1Ev();
extern void _ZN7G13x4y4D1Ev();
Name_Map name_map_G13x4y4[] = {
  NSPAIR(_ZN7G13x4y4C1Ev),
  NSPAIR(_ZN7G13x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G13x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y4[] = {
  {&(_ZTV7G13x4y4[3]),  3,8},
  {&(_tg__ZTV5E13x4__7G13x4y4[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y4[3]),  3,4},
  {&(_ZTV7G13x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G13x4y4[];
extern  VTBL_ENTRY _ZTV7G13x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y4[];
Class_Descriptor cd_G13x4y4 = {  "G13x4y4", // class name
  bases_G13x4y4, 6,
  &(vtc_G13x4y4[0]), // expected_vtbl_contents
  &(vtt_G13x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G13x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y5  : virtual E13x4 , F0 {
  int ff;
  ~G13x4y5(); // tgen
  G13x4y5(); // tgen
};
//SIG(1 G13x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G13x4y5 ::~G13x4y5(){ note_dtor("G13x4y5", this);} // tgen
G13x4y5 ::G13x4y5(){ note_ctor("G13x4y5", this);} // tgen

static void Test_G13x4y5()
{
  extern Class_Descriptor cd_G13x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x4y5, buf);
    G13x4y5 *dp, &lv = *(dp=new (buf) G13x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y5)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), ABISELECT(16,12), "G13x4y5");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(40,32), "G13x4y5");
    check_base_class_offset(lv, (C13*)(E13x4*), ABISELECT(16,12), "G13x4y5");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(32,24), "G13x4y5");
    check_base_class_offset(lv, (E13x4*), ABISELECT(16,12), "G13x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x4y5.ff");
    test_class_info(&lv, &cd_G13x4y5);
    dp->~G13x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y5(Test_G13x4y5, "G13x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x4y5C1Ev();
extern void _ZN7G13x4y5D1Ev();
Name_Map name_map_G13x4y5[] = {
  NSPAIR(_ZN7G13x4y5C1Ev),
  NSPAIR(_ZN7G13x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G13x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y5[] = {
  {&(_ZTV7G13x4y5[4]),  4,13},
  {&(_ZTV7G13x4y5[8]),  8,13},
  {&(_ZTV7G13x4y5[12]),  12,13},
  {&(_tg__ZTV5E13x4__7G13x4y5[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x4y5[];
extern  VTBL_ENTRY _ZTV7G13x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y5[];
Class_Descriptor cd_G13x4y5 = {  "G13x4y5", // class name
  bases_G13x4y5, 6,
  &(vtc_G13x4y5[0]), // expected_vtbl_contents
  &(vtt_G13x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y6  : E13x4 , virtual F0 {
  int ff;
  ~G13x4y6(); // tgen
  G13x4y6(); // tgen
};
//SIG(1 G13x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x4y6 ::~G13x4y6(){ note_dtor("G13x4y6", this);} // tgen
G13x4y6 ::G13x4y6(){ note_ctor("G13x4y6", this);} // tgen

static void Test_G13x4y6()
{
  extern Class_Descriptor cd_G13x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x4y6, buf);
    G13x4y6 *dp, &lv = *(dp=new (buf) G13x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y6)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), 0, "G13x4y6");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(32,24), "G13x4y6");
    check_base_class_offset(lv, (C13*)(E13x4*), 0, "G13x4y6");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(16,12), "G13x4y6");
    check_base_class_offset(lv, (E13x4*), 0, "G13x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G13x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G13x4y6.ff");
    test_class_info(&lv, &cd_G13x4y6);
    dp->~G13x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y6(Test_G13x4y6, "G13x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G13x4y6C1Ev();
extern void _ZN7G13x4y6D1Ev();
Name_Map name_map_G13x4y6[] = {
  NSPAIR(_ZN7G13x4y6C1Ev),
  NSPAIR(_ZN7G13x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y6[] = {
  {&(_ZTV7G13x4y6[4]),  4,9},
  {&(_tg__ZTV5E13x4__7G13x4y6[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y6[3]),  3,4},
  {&(_ZTV7G13x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G13x4y6[];
extern  VTBL_ENTRY _ZTV7G13x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y6[];
Class_Descriptor cd_G13x4y6 = {  "G13x4y6", // class name
  bases_G13x4y6, 6,
  &(vtc_G13x4y6[0]), // expected_vtbl_contents
  &(vtt_G13x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G13x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x4y7  : virtual E13x4 , virtual F0 {
  int ff;
  ~G13x4y7(); // tgen
  G13x4y7(); // tgen
};
//SIG(1 G13x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x4y7 ::~G13x4y7(){ note_dtor("G13x4y7", this);} // tgen
G13x4y7 ::G13x4y7(){ note_ctor("G13x4y7", this);} // tgen

static void Test_G13x4y7()
{
  extern Class_Descriptor cd_G13x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x4y7, buf);
    G13x4y7 *dp, &lv = *(dp=new (buf) G13x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x4y7)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x4*), ABISELECT(16,8), "G13x4y7");
    check_base_class_offset(lv, (B1*)(C13*)(E13x4*), ABISELECT(40,28), "G13x4y7");
    check_base_class_offset(lv, (C13*)(E13x4*), ABISELECT(16,8), "G13x4y7");
    check_base_class_offset(lv, (D0*)(E13x4*), ABISELECT(32,20), "G13x4y7");
    check_base_class_offset(lv, (E13x4*), ABISELECT(16,8), "G13x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G13x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x4y7.ff");
    test_class_info(&lv, &cd_G13x4y7);
    dp->~G13x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x4y7(Test_G13x4y7, "G13x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x4y7C1Ev();
extern void _ZN7G13x4y7D1Ev();
Name_Map name_map_G13x4y7[] = {
  NSPAIR(_ZN7G13x4y7C1Ev),
  NSPAIR(_ZN7G13x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x4;
extern VTBL_ENTRY _ZTI5E13x4[];
extern  VTBL_ENTRY _ZTV5E13x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x4y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x4y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x4__7G13x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x4__7G13x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x4__7G13x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x4__7G13x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x4y7[] = {
  {&(_ZTV7G13x4y7[5]),  5,14},
  {&(_ZTV7G13x4y7[9]),  9,14},
  {&(_ZTV7G13x4y7[13]),  13,14},
  {&(_tg__ZTV5E13x4__7G13x4y7[3]),  3,4},
  {&(_tg__ZTV3C135E13x4__7G13x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x4__7G13x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x4__7G13x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x4y7[];
extern  VTBL_ENTRY _ZTV7G13x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x4y7[];
Class_Descriptor cd_G13x4y7 = {  "G13x4y7", // class name
  bases_G13x4y7, 6,
  &(vtc_G13x4y7[0]), // expected_vtbl_contents
  &(vtt_G13x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x4y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x4y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x4  : C14 , D0 {
  int fd;
  ~E14x4(); // tgen
  E14x4(); // tgen
};
//SIG(-1 E14x4) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E14x4 ::~E14x4(){ note_dtor("E14x4", this);} // tgen
E14x4 ::E14x4(){ note_ctor("E14x4", this);} // tgen

static void Test_E14x4()
{
  extern Class_Descriptor cd_E14x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E14x4, buf);
    E14x4 *dp, &lv = *(dp=new (buf) E14x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E14x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x4)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(20,16), "E14x4");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(24,20), "E14x4");
    check_base_class_offset(lv, (C14*), 0, "E14x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E14x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E14x4.fd");
    test_class_info(&lv, &cd_E14x4);
    dp->~E14x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x4(Test_E14x4, "E14x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E14x4C1Ev();
extern void _ZN5E14x4D1Ev();
Name_Map name_map_E14x4[] = {
  NSPAIR(_ZN5E14x4C1Ev),
  NSPAIR(_ZN5E14x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E14x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E14x4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E14x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E14x4[];
static  VTBL_ENTRY _tg__ZTV3C14__5E14x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__5E14x4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x4[] = {
  {&(_ZTV5E14x4[4]),  4,8},
  {&(_tg__ZTV3C14__5E14x4[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__5E14x4[3]),  3,4},
  {&(_ZTV5E14x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
Class_Descriptor cd_E14x4 = {  "E14x4", // class name
  bases_E14x4, 4,
  &(vtc_E14x4[0]), // expected_vtbl_contents
  &(vtt_E14x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E14x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E14x4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E14x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y0  : E14x4 , F1 {
  int ff;
  ~G14x4y0(); // tgen
  G14x4y0(); // tgen
};
//SIG(1 G14x4y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x4y0 ::~G14x4y0(){ note_dtor("G14x4y0", this);} // tgen
G14x4y0 ::G14x4y0(){ note_ctor("G14x4y0", this);} // tgen

static void Test_G14x4y0()
{
  extern Class_Descriptor cd_G14x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G14x4y0, buf);
    G14x4y0 *dp, &lv = *(dp=new (buf) G14x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G14x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y0)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(40,28), "G14x4y0");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(48,32), "G14x4y0");
    check_base_class_offset(lv, (C14*)(E14x4*), 0, "G14x4y0");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(12,8), "G14x4y0");
    check_base_class_offset(lv, (E14x4*), 0, "G14x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G14x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G14x4y0.ff");
    test_class_info(&lv, &cd_G14x4y0);
    dp->~G14x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y0(Test_G14x4y0, "G14x4y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G14x4y0C1Ev();
extern void _ZN7G14x4y0D1Ev();
Name_Map name_map_G14x4y0[] = {
  NSPAIR(_ZN7G14x4y0C1Ev),
  NSPAIR(_ZN7G14x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x4y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G14x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y0[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y0[] = {
  {&(_ZTV7G14x4y0[4]),  4,11},
  {&(_tg__ZTV5E14x4__7G14x4y0[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y0[3]),  3,4},
  {&(_ZTV7G14x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G14x4y0[];
extern  VTBL_ENTRY _ZTV7G14x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y0[];
Class_Descriptor cd_G14x4y0 = {  "G14x4y0", // class name
  bases_G14x4y0, 6,
  &(vtc_G14x4y0[0]), // expected_vtbl_contents
  &(vtt_G14x4y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G14x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y1  : virtual E14x4 , F1 {
  int ff;
  ~G14x4y1(); // tgen
  G14x4y1(); // tgen
};
//SIG(1 G14x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x4y1 ::~G14x4y1(){ note_dtor("G14x4y1", this);} // tgen
G14x4y1 ::G14x4y1(){ note_ctor("G14x4y1", this);} // tgen

static void Test_G14x4y1()
{
  extern Class_Descriptor cd_G14x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x4y1, buf);
    G14x4y1 *dp, &lv = *(dp=new (buf) G14x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y1)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(36,28), "G14x4y1");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(40,32), "G14x4y1");
    check_base_class_offset(lv, (C14*)(E14x4*), ABISELECT(16,12), "G14x4y1");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(28,20), "G14x4y1");
    check_base_class_offset(lv, (E14x4*), ABISELECT(16,12), "G14x4y1");
    check_base_class_offset(lv, (F1*), 0, "G14x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x4y1.ff");
    test_class_info(&lv, &cd_G14x4y1);
    dp->~G14x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y1(Test_G14x4y1, "G14x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x4y1C1Ev();
extern void _ZN7G14x4y1D1Ev();
Name_Map name_map_G14x4y1[] = {
  NSPAIR(_ZN7G14x4y1C1Ev),
  NSPAIR(_ZN7G14x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x4y1[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G14x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y1[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y1[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y1[] = {
  {&(_ZTV7G14x4y1[5]),  5,14},
  {&(_ZTV7G14x4y1[10]),  10,14},
  {&(_ZTV7G14x4y1[13]),  13,14},
  {&(_tg__ZTV5E14x4__7G14x4y1[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x4y1[];
extern  VTBL_ENTRY _ZTV7G14x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y1[];
Class_Descriptor cd_G14x4y1 = {  "G14x4y1", // class name
  bases_G14x4y1, 6,
  &(vtc_G14x4y1[0]), // expected_vtbl_contents
  &(vtt_G14x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y2  : E14x4 , virtual F1 {
  int ff;
  ~G14x4y2(); // tgen
  G14x4y2(); // tgen
};
//SIG(1 G14x4y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x4y2 ::~G14x4y2(){ note_dtor("G14x4y2", this);} // tgen
G14x4y2 ::G14x4y2(){ note_ctor("G14x4y2", this);} // tgen

static void Test_G14x4y2()
{
  extern Class_Descriptor cd_G14x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G14x4y2, buf);
    G14x4y2 *dp, &lv = *(dp=new (buf) G14x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G14x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y2)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(24,20), "G14x4y2");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(32,24), "G14x4y2");
    check_base_class_offset(lv, (C14*)(E14x4*), 0, "G14x4y2");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(12,8), "G14x4y2");
    check_base_class_offset(lv, (E14x4*), 0, "G14x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G14x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x4y2.ff");
    test_class_info(&lv, &cd_G14x4y2);
    dp->~G14x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y2(Test_G14x4y2, "G14x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G14x4y2C1Ev();
extern void _ZN7G14x4y2D1Ev();
Name_Map name_map_G14x4y2[] = {
  NSPAIR(_ZN7G14x4y2C1Ev),
  NSPAIR(_ZN7G14x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y2[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y2[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y2[] = {
  {&(_ZTV7G14x4y2[5]),  5,13},
  {&(_tg__ZTV5E14x4__7G14x4y2[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y2[3]),  3,4},
  {&(_ZTV7G14x4y2[8]),  8,13},
  {&(_ZTV7G14x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G14x4y2[];
extern  VTBL_ENTRY _ZTV7G14x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y2[];
Class_Descriptor cd_G14x4y2 = {  "G14x4y2", // class name
  bases_G14x4y2, 6,
  &(vtc_G14x4y2[0]), // expected_vtbl_contents
  &(vtt_G14x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G14x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y3  : virtual E14x4 , virtual F1 {
  int ff;
  ~G14x4y3(); // tgen
  G14x4y3(); // tgen
};
//SIG(1 G14x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x4y3 ::~G14x4y3(){ note_dtor("G14x4y3", this);} // tgen
G14x4y3 ::G14x4y3(){ note_ctor("G14x4y3", this);} // tgen

static void Test_G14x4y3()
{
  extern Class_Descriptor cd_G14x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x4y3, buf);
    G14x4y3 *dp, &lv = *(dp=new (buf) G14x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y3)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(36,24), "G14x4y3");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(40,28), "G14x4y3");
    check_base_class_offset(lv, (C14*)(E14x4*), ABISELECT(16,8), "G14x4y3");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(28,16), "G14x4y3");
    check_base_class_offset(lv, (E14x4*), ABISELECT(16,8), "G14x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G14x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x4y3.ff");
    test_class_info(&lv, &cd_G14x4y3);
    dp->~G14x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y3(Test_G14x4y3, "G14x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G14x4y3C1Ev();
extern void _ZN7G14x4y3D1Ev();
Name_Map name_map_G14x4y3[] = {
  NSPAIR(_ZN7G14x4y3C1Ev),
  NSPAIR(_ZN7G14x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y3[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x4y3[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G14x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y3[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y3[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y3[] = {
  {&(_ZTV7G14x4y3[6]),  6,18},
  {&(_ZTV7G14x4y3[10]),  10,18},
  {&(_ZTV7G14x4y3[13]),  13,18},
  {&(_ZTV7G14x4y3[17]),  17,18},
  {&(_tg__ZTV5E14x4__7G14x4y3[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x4y3[];
extern  VTBL_ENTRY _ZTV7G14x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y3[];
Class_Descriptor cd_G14x4y3 = {  "G14x4y3", // class name
  bases_G14x4y3, 6,
  &(vtc_G14x4y3[0]), // expected_vtbl_contents
  &(vtt_G14x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G14x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y4  : E14x4 , F0 {
  int ff;
  ~G14x4y4(); // tgen
  G14x4y4(); // tgen
};
//SIG(1 G14x4y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G14x4y4 ::~G14x4y4(){ note_dtor("G14x4y4", this);} // tgen
G14x4y4 ::G14x4y4(){ note_ctor("G14x4y4", this);} // tgen

static void Test_G14x4y4()
{
  extern Class_Descriptor cd_G14x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x4y4, buf);
    G14x4y4 *dp, &lv = *(dp=new (buf) G14x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y4)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(28,24), "G14x4y4");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(32,28), "G14x4y4");
    check_base_class_offset(lv, (C14*)(E14x4*), 0, "G14x4y4");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(12,8), "G14x4y4");
    check_base_class_offset(lv, (E14x4*), 0, "G14x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G14x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G14x4y4.ff");
    test_class_info(&lv, &cd_G14x4y4);
    dp->~G14x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y4(Test_G14x4y4, "G14x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G14x4y4C1Ev();
extern void _ZN7G14x4y4D1Ev();
Name_Map name_map_G14x4y4[] = {
  NSPAIR(_ZN7G14x4y4C1Ev),
  NSPAIR(_ZN7G14x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y4[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G14x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y4[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y4[] = {
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y4[] = {
  {&(_ZTV7G14x4y4[4]),  4,8},
  {&(_tg__ZTV5E14x4__7G14x4y4[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y4[3]),  3,4},
  {&(_ZTV7G14x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G14x4y4[];
extern  VTBL_ENTRY _ZTV7G14x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y4[];
Class_Descriptor cd_G14x4y4 = {  "G14x4y4", // class name
  bases_G14x4y4, 6,
  &(vtc_G14x4y4[0]), // expected_vtbl_contents
  &(vtt_G14x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G14x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y5  : virtual E14x4 , F0 {
  int ff;
  ~G14x4y5(); // tgen
  G14x4y5(); // tgen
};
//SIG(1 G14x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G14x4y5 ::~G14x4y5(){ note_dtor("G14x4y5", this);} // tgen
G14x4y5 ::G14x4y5(){ note_ctor("G14x4y5", this);} // tgen

static void Test_G14x4y5()
{
  extern Class_Descriptor cd_G14x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x4y5, buf);
    G14x4y5 *dp, &lv = *(dp=new (buf) G14x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y5)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(36,28), "G14x4y5");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(40,32), "G14x4y5");
    check_base_class_offset(lv, (C14*)(E14x4*), ABISELECT(16,12), "G14x4y5");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(28,20), "G14x4y5");
    check_base_class_offset(lv, (E14x4*), ABISELECT(16,12), "G14x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x4y5.ff");
    test_class_info(&lv, &cd_G14x4y5);
    dp->~G14x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y5(Test_G14x4y5, "G14x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x4y5C1Ev();
extern void _ZN7G14x4y5D1Ev();
Name_Map name_map_G14x4y5[] = {
  NSPAIR(_ZN7G14x4y5C1Ev),
  NSPAIR(_ZN7G14x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y5[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x4y5[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G14x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y5[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y5[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y5[] = {
  {&(_ZTV7G14x4y5[5]),  5,13},
  {&(_ZTV7G14x4y5[9]),  9,13},
  {&(_ZTV7G14x4y5[12]),  12,13},
  {&(_tg__ZTV5E14x4__7G14x4y5[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x4y5[];
extern  VTBL_ENTRY _ZTV7G14x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y5[];
Class_Descriptor cd_G14x4y5 = {  "G14x4y5", // class name
  bases_G14x4y5, 6,
  &(vtc_G14x4y5[0]), // expected_vtbl_contents
  &(vtt_G14x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y6  : E14x4 , virtual F0 {
  int ff;
  ~G14x4y6(); // tgen
  G14x4y6(); // tgen
};
//SIG(1 G14x4y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x4y6 ::~G14x4y6(){ note_dtor("G14x4y6", this);} // tgen
G14x4y6 ::G14x4y6(){ note_ctor("G14x4y6", this);} // tgen

static void Test_G14x4y6()
{
  extern Class_Descriptor cd_G14x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x4y6, buf);
    G14x4y6 *dp, &lv = *(dp=new (buf) G14x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y6)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(24,20), "G14x4y6");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(32,24), "G14x4y6");
    check_base_class_offset(lv, (C14*)(E14x4*), 0, "G14x4y6");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(12,8), "G14x4y6");
    check_base_class_offset(lv, (E14x4*), 0, "G14x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G14x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x4y6.ff");
    test_class_info(&lv, &cd_G14x4y6);
    dp->~G14x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y6(Test_G14x4y6, "G14x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G14x4y6C1Ev();
extern void _ZN7G14x4y6D1Ev();
Name_Map name_map_G14x4y6[] = {
  NSPAIR(_ZN7G14x4y6C1Ev),
  NSPAIR(_ZN7G14x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y6[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y6[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y6[] = {
  {&(_ZTV7G14x4y6[5]),  5,9},
  {&(_tg__ZTV5E14x4__7G14x4y6[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y6[3]),  3,4},
  {&(_ZTV7G14x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G14x4y6[];
extern  VTBL_ENTRY _ZTV7G14x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y6[];
Class_Descriptor cd_G14x4y6 = {  "G14x4y6", // class name
  bases_G14x4y6, 6,
  &(vtc_G14x4y6[0]), // expected_vtbl_contents
  &(vtt_G14x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G14x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x4y7  : virtual E14x4 , virtual F0 {
  int ff;
  ~G14x4y7(); // tgen
  G14x4y7(); // tgen
};
//SIG(1 G14x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x4y7 ::~G14x4y7(){ note_dtor("G14x4y7", this);} // tgen
G14x4y7 ::G14x4y7(){ note_ctor("G14x4y7", this);} // tgen

static void Test_G14x4y7()
{
  extern Class_Descriptor cd_G14x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x4y7, buf);
    G14x4y7 *dp, &lv = *(dp=new (buf) G14x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x4y7)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x4*), ABISELECT(36,24), "G14x4y7");
    check_base_class_offset(lv, (B1*)(C14*)(E14x4*), ABISELECT(40,28), "G14x4y7");
    check_base_class_offset(lv, (C14*)(E14x4*), ABISELECT(16,8), "G14x4y7");
    check_base_class_offset(lv, (D0*)(E14x4*), ABISELECT(28,16), "G14x4y7");
    check_base_class_offset(lv, (E14x4*), ABISELECT(16,8), "G14x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G14x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x4y7.ff");
    test_class_info(&lv, &cd_G14x4y7);
    dp->~G14x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x4y7(Test_G14x4y7, "G14x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x4y7C1Ev();
extern void _ZN7G14x4y7D1Ev();
Name_Map name_map_G14x4y7[] = {
  NSPAIR(_ZN7G14x4y7C1Ev),
  NSPAIR(_ZN7G14x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x4;
extern VTBL_ENTRY _ZTI5E14x4[];
extern  VTBL_ENTRY _ZTV5E14x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x4y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x4y7[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x4y7[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x4y7[];
static  VTBL_ENTRY _tg__ZTV5E14x4__7G14x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x4__7G14x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x4__7G14x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x4__7G14x4y7[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x4y7[] = {
  {&(_ZTV7G14x4y7[6]),  6,14},
  {&(_ZTV7G14x4y7[10]),  10,14},
  {&(_ZTV7G14x4y7[13]),  13,14},
  {&(_tg__ZTV5E14x4__7G14x4y7[4]),  4,4},
  {&(_tg__ZTV3C145E14x4__7G14x4y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x4__7G14x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x4__7G14x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x4y7[];
extern  VTBL_ENTRY _ZTV7G14x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x4y7[];
Class_Descriptor cd_G14x4y7 = {  "G14x4y7", // class name
  bases_G14x4y7, 6,
  &(vtc_G14x4y7[0]), // expected_vtbl_contents
  &(vtt_G14x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x4y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E15x4  : C15 , D0 {
  int fd;
  ~E15x4(); // tgen
  E15x4(); // tgen
};
//SIG(-1 E15x4) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E15x4 ::~E15x4(){ note_dtor("E15x4", this);} // tgen
E15x4 ::E15x4(){ note_ctor("E15x4", this);} // tgen

static void Test_E15x4()
{
  extern Class_Descriptor cd_E15x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E15x4, buf);
    E15x4 *dp, &lv = *(dp=new (buf) E15x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E15x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x4)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(24,16), "E15x4");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(40,24), "E15x4");
    check_base_class_offset(lv, (C15*), 0, "E15x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E15x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E15x4.fd");
    test_class_info(&lv, &cd_E15x4);
    dp->~E15x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x4(Test_E15x4, "E15x4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN5E15x4C1Ev();
extern void _ZN5E15x4D1Ev();
Name_Map name_map_E15x4[] = {
  NSPAIR(_ZN5E15x4C1Ev),
  NSPAIR(_ZN5E15x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E15x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E15x4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E15x4[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E15x4[];
static  VTBL_ENTRY _tg__ZTV3C15__5E15x4[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__5E15x4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__5E15x4[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x4[] = {
  {&(_ZTV5E15x4[4]),  4,12},
  {&(_tg__ZTV3C15__5E15x4[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__5E15x4[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__5E15x4[3]),  3,4},
  {&(_ZTV5E15x4[7]),  7,12},
  {&(_ZTV5E15x4[11]),  11,12},
};
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
Class_Descriptor cd_E15x4 = {  "E15x4", // class name
  bases_E15x4, 4,
  &(vtc_E15x4[0]), // expected_vtbl_contents
  &(vtt_E15x4[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI5E15x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E15x4),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E15x4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y0  : E15x4 , F1 {
  int ff;
  ~G15x4y0(); // tgen
  G15x4y0(); // tgen
};
//SIG(1 G15x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x4y0 ::~G15x4y0(){ note_dtor("G15x4y0", this);} // tgen
G15x4y0 ::G15x4y0(){ note_ctor("G15x4y0", this);} // tgen

static void Test_G15x4y0()
{
  extern Class_Descriptor cd_G15x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x4y0, buf);
    G15x4y0 *dp, &lv = *(dp=new (buf) G15x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y0)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(40,28), "G15x4y0");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(56,36), "G15x4y0");
    check_base_class_offset(lv, (C15*)(E15x4*), 0, "G15x4y0");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(12,8), "G15x4y0");
    check_base_class_offset(lv, (E15x4*), 0, "G15x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G15x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G15x4y0.ff");
    test_class_info(&lv, &cd_G15x4y0);
    dp->~G15x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y0(Test_G15x4y0, "G15x4y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x4y0C1Ev();
extern void _ZN7G15x4y0D1Ev();
Name_Map name_map_G15x4y0[] = {
  NSPAIR(_ZN7G15x4y0C1Ev),
  NSPAIR(_ZN7G15x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x4y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G15x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x4y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G15x4y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y0[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y0[] = {
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y0[] = {
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y0[] = {
  {&(_ZTV7G15x4y0[4]),  4,15},
  {&(_tg__ZTV5E15x4__7G15x4y0[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y0[3]),  3,4},
  {&(_ZTV7G15x4y0[10]),  10,15},
  {&(_ZTV7G15x4y0[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G15x4y0[];
extern  VTBL_ENTRY _ZTV7G15x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y0[];
Class_Descriptor cd_G15x4y0 = {  "G15x4y0", // class name
  bases_G15x4y0, 6,
  &(vtc_G15x4y0[0]), // expected_vtbl_contents
  &(vtt_G15x4y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y0),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y0),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y1  : virtual E15x4 , F1 {
  int ff;
  ~G15x4y1(); // tgen
  G15x4y1(); // tgen
};
//SIG(1 G15x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x4y1 ::~G15x4y1(){ note_dtor("G15x4y1", this);} // tgen
G15x4y1 ::G15x4y1(){ note_ctor("G15x4y1", this);} // tgen

static void Test_G15x4y1()
{
  extern Class_Descriptor cd_G15x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x4y1, buf);
    G15x4y1 *dp, &lv = *(dp=new (buf) G15x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y1)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(40,28), "G15x4y1");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(56,36), "G15x4y1");
    check_base_class_offset(lv, (C15*)(E15x4*), ABISELECT(16,12), "G15x4y1");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(28,20), "G15x4y1");
    check_base_class_offset(lv, (E15x4*), ABISELECT(16,12), "G15x4y1");
    check_base_class_offset(lv, (F1*), 0, "G15x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x4y1.ff");
    test_class_info(&lv, &cd_G15x4y1);
    dp->~G15x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y1(Test_G15x4y1, "G15x4y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x4y1C1Ev();
extern void _ZN7G15x4y1D1Ev();
Name_Map name_map_G15x4y1[] = {
  NSPAIR(_ZN7G15x4y1C1Ev),
  NSPAIR(_ZN7G15x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x4y1[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x4y1[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x4y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G15x4y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y1[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y1[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y1[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y1[] = {
  {&(_ZTV7G15x4y1[5]),  5,18},
  {&(_ZTV7G15x4y1[10]),  10,18},
  {&(_ZTV7G15x4y1[13]),  13,18},
  {&(_ZTV7G15x4y1[17]),  17,18},
  {&(_tg__ZTV5E15x4__7G15x4y1[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x4y1[];
extern  VTBL_ENTRY _ZTV7G15x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y1[];
Class_Descriptor cd_G15x4y1 = {  "G15x4y1", // class name
  bases_G15x4y1, 6,
  &(vtc_G15x4y1[0]), // expected_vtbl_contents
  &(vtt_G15x4y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y1),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y1),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y2  : E15x4 , virtual F1 {
  int ff;
  ~G15x4y2(); // tgen
  G15x4y2(); // tgen
};
//SIG(1 G15x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x4y2 ::~G15x4y2(){ note_dtor("G15x4y2", this);} // tgen
G15x4y2 ::G15x4y2(){ note_ctor("G15x4y2", this);} // tgen

static void Test_G15x4y2()
{
  extern Class_Descriptor cd_G15x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x4y2, buf);
    G15x4y2 *dp, &lv = *(dp=new (buf) G15x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y2)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(24,20), "G15x4y2");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(40,28), "G15x4y2");
    check_base_class_offset(lv, (C15*)(E15x4*), 0, "G15x4y2");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(12,8), "G15x4y2");
    check_base_class_offset(lv, (E15x4*), 0, "G15x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G15x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x4y2.ff");
    test_class_info(&lv, &cd_G15x4y2);
    dp->~G15x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y2(Test_G15x4y2, "G15x4y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x4y2C1Ev();
extern void _ZN7G15x4y2D1Ev();
Name_Map name_map_G15x4y2[] = {
  NSPAIR(_ZN7G15x4y2C1Ev),
  NSPAIR(_ZN7G15x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    10, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x4y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y2[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G15x4y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x4y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G15x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y2[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y2[] = {
  {&(_ZTV7G15x4y2[5]),  5,17},
  {&(_tg__ZTV5E15x4__7G15x4y2[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y2[3]),  3,4},
  {&(_ZTV7G15x4y2[8]),  8,17},
  {&(_ZTV7G15x4y2[12]),  12,17},
  {&(_ZTV7G15x4y2[16]),  16,17},
};
extern VTBL_ENTRY _ZTI7G15x4y2[];
extern  VTBL_ENTRY _ZTV7G15x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y2[];
Class_Descriptor cd_G15x4y2 = {  "G15x4y2", // class name
  bases_G15x4y2, 6,
  &(vtc_G15x4y2[0]), // expected_vtbl_contents
  &(vtt_G15x4y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y2),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y2),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y3  : virtual E15x4 , virtual F1 {
  int ff;
  ~G15x4y3(); // tgen
  G15x4y3(); // tgen
};
//SIG(1 G15x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x4y3 ::~G15x4y3(){ note_dtor("G15x4y3", this);} // tgen
G15x4y3 ::G15x4y3(){ note_ctor("G15x4y3", this);} // tgen

static void Test_G15x4y3()
{
  extern Class_Descriptor cd_G15x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G15x4y3, buf);
    G15x4y3 *dp, &lv = *(dp=new (buf) G15x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G15x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y3)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(40,24), "G15x4y3");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(56,32), "G15x4y3");
    check_base_class_offset(lv, (C15*)(E15x4*), ABISELECT(16,8), "G15x4y3");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(28,16), "G15x4y3");
    check_base_class_offset(lv, (E15x4*), ABISELECT(16,8), "G15x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G15x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x4y3.ff");
    test_class_info(&lv, &cd_G15x4y3);
    dp->~G15x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y3(Test_G15x4y3, "G15x4y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G15x4y3C1Ev();
extern void _ZN7G15x4y3D1Ev();
Name_Map name_map_G15x4y3[] = {
  NSPAIR(_ZN7G15x4y3C1Ev),
  NSPAIR(_ZN7G15x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x4y3[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y3[0]),
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x4y3[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x4y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G15x4y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G15x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y3[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y3[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y3[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y3[] = {
  {&(_ZTV7G15x4y3[6]),  6,22},
  {&(_ZTV7G15x4y3[10]),  10,22},
  {&(_ZTV7G15x4y3[13]),  13,22},
  {&(_ZTV7G15x4y3[17]),  17,22},
  {&(_ZTV7G15x4y3[21]),  21,22},
  {&(_tg__ZTV5E15x4__7G15x4y3[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x4y3[];
extern  VTBL_ENTRY _ZTV7G15x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y3[];
Class_Descriptor cd_G15x4y3 = {  "G15x4y3", // class name
  bases_G15x4y3, 6,
  &(vtc_G15x4y3[0]), // expected_vtbl_contents
  &(vtt_G15x4y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G15x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y3),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y3),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y4  : E15x4 , F0 {
  int ff;
  ~G15x4y4(); // tgen
  G15x4y4(); // tgen
};
//SIG(1 G15x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G15x4y4 ::~G15x4y4(){ note_dtor("G15x4y4", this);} // tgen
G15x4y4 ::G15x4y4(){ note_ctor("G15x4y4", this);} // tgen

static void Test_G15x4y4()
{
  extern Class_Descriptor cd_G15x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G15x4y4, buf);
    G15x4y4 *dp, &lv = *(dp=new (buf) G15x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G15x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y4)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(32,24), "G15x4y4");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(48,32), "G15x4y4");
    check_base_class_offset(lv, (C15*)(E15x4*), 0, "G15x4y4");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(12,8), "G15x4y4");
    check_base_class_offset(lv, (E15x4*), 0, "G15x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G15x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G15x4y4.ff");
    test_class_info(&lv, &cd_G15x4y4);
    dp->~G15x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y4(Test_G15x4y4, "G15x4y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G15x4y4C1Ev();
extern void _ZN7G15x4y4D1Ev();
Name_Map name_map_G15x4y4[] = {
  NSPAIR(_ZN7G15x4y4C1Ev),
  NSPAIR(_ZN7G15x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x4y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y4[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x4y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x4y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y4[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y4[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y4[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y4[] = {
  {&(_ZTV7G15x4y4[4]),  4,12},
  {&(_tg__ZTV5E15x4__7G15x4y4[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y4[3]),  3,4},
  {&(_ZTV7G15x4y4[7]),  7,12},
  {&(_ZTV7G15x4y4[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G15x4y4[];
extern  VTBL_ENTRY _ZTV7G15x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y4[];
Class_Descriptor cd_G15x4y4 = {  "G15x4y4", // class name
  bases_G15x4y4, 6,
  &(vtc_G15x4y4[0]), // expected_vtbl_contents
  &(vtt_G15x4y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G15x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y4),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y4),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y5  : virtual E15x4 , F0 {
  int ff;
  ~G15x4y5(); // tgen
  G15x4y5(); // tgen
};
//SIG(1 G15x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G15x4y5 ::~G15x4y5(){ note_dtor("G15x4y5", this);} // tgen
G15x4y5 ::G15x4y5(){ note_ctor("G15x4y5", this);} // tgen

static void Test_G15x4y5()
{
  extern Class_Descriptor cd_G15x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x4y5, buf);
    G15x4y5 *dp, &lv = *(dp=new (buf) G15x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y5)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(40,28), "G15x4y5");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(56,36), "G15x4y5");
    check_base_class_offset(lv, (C15*)(E15x4*), ABISELECT(16,12), "G15x4y5");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(28,20), "G15x4y5");
    check_base_class_offset(lv, (E15x4*), ABISELECT(16,12), "G15x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x4y5.ff");
    test_class_info(&lv, &cd_G15x4y5);
    dp->~G15x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y5(Test_G15x4y5, "G15x4y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x4y5C1Ev();
extern void _ZN7G15x4y5D1Ev();
Name_Map name_map_G15x4y5[] = {
  NSPAIR(_ZN7G15x4y5C1Ev),
  NSPAIR(_ZN7G15x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x4y5[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y5[0]),
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x4y5[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x4y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G15x4y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y5[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y5[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y5[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y5[] = {
  {&(_ZTV7G15x4y5[5]),  5,17},
  {&(_ZTV7G15x4y5[9]),  9,17},
  {&(_ZTV7G15x4y5[12]),  12,17},
  {&(_ZTV7G15x4y5[16]),  16,17},
  {&(_tg__ZTV5E15x4__7G15x4y5[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x4y5[];
extern  VTBL_ENTRY _ZTV7G15x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y5[];
Class_Descriptor cd_G15x4y5 = {  "G15x4y5", // class name
  bases_G15x4y5, 6,
  &(vtc_G15x4y5[0]), // expected_vtbl_contents
  &(vtt_G15x4y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y5),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y5),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y6  : E15x4 , virtual F0 {
  int ff;
  ~G15x4y6(); // tgen
  G15x4y6(); // tgen
};
//SIG(1 G15x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x4y6 ::~G15x4y6(){ note_dtor("G15x4y6", this);} // tgen
G15x4y6 ::G15x4y6(){ note_ctor("G15x4y6", this);} // tgen

static void Test_G15x4y6()
{
  extern Class_Descriptor cd_G15x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G15x4y6, buf);
    G15x4y6 *dp, &lv = *(dp=new (buf) G15x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G15x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y6)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(24,20), "G15x4y6");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(40,28), "G15x4y6");
    check_base_class_offset(lv, (C15*)(E15x4*), 0, "G15x4y6");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(12,8), "G15x4y6");
    check_base_class_offset(lv, (E15x4*), 0, "G15x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G15x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x4y6.ff");
    test_class_info(&lv, &cd_G15x4y6);
    dp->~G15x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y6(Test_G15x4y6, "G15x4y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G15x4y6C1Ev();
extern void _ZN7G15x4y6D1Ev();
Name_Map name_map_G15x4y6[] = {
  NSPAIR(_ZN7G15x4y6C1Ev),
  NSPAIR(_ZN7G15x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x4y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y6[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G15x4y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x4y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y6[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y6[] = {
  {&(_ZTV7G15x4y6[5]),  5,13},
  {&(_tg__ZTV5E15x4__7G15x4y6[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y6[3]),  3,4},
  {&(_ZTV7G15x4y6[8]),  8,13},
  {&(_ZTV7G15x4y6[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G15x4y6[];
extern  VTBL_ENTRY _ZTV7G15x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y6[];
Class_Descriptor cd_G15x4y6 = {  "G15x4y6", // class name
  bases_G15x4y6, 6,
  &(vtc_G15x4y6[0]), // expected_vtbl_contents
  &(vtt_G15x4y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G15x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y6),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y6),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x4y7  : virtual E15x4 , virtual F0 {
  int ff;
  ~G15x4y7(); // tgen
  G15x4y7(); // tgen
};
//SIG(1 G15x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x4y7 ::~G15x4y7(){ note_dtor("G15x4y7", this);} // tgen
G15x4y7 ::G15x4y7(){ note_ctor("G15x4y7", this);} // tgen

static void Test_G15x4y7()
{
  extern Class_Descriptor cd_G15x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x4y7, buf);
    G15x4y7 *dp, &lv = *(dp=new (buf) G15x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x4y7)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x4*), ABISELECT(40,24), "G15x4y7");
    check_base_class_offset(lv, (B1*)(C15*)(E15x4*), ABISELECT(56,32), "G15x4y7");
    check_base_class_offset(lv, (C15*)(E15x4*), ABISELECT(16,8), "G15x4y7");
    check_base_class_offset(lv, (D0*)(E15x4*), ABISELECT(28,16), "G15x4y7");
    check_base_class_offset(lv, (E15x4*), ABISELECT(16,8), "G15x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G15x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x4y7.ff");
    test_class_info(&lv, &cd_G15x4y7);
    dp->~G15x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x4y7(Test_G15x4y7, "G15x4y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x4y7C1Ev();
extern void _ZN7G15x4y7D1Ev();
Name_Map name_map_G15x4y7[] = {
  NSPAIR(_ZN7G15x4y7C1Ev),
  NSPAIR(_ZN7G15x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x4;
extern VTBL_ENTRY _ZTI5E15x4[];
extern  VTBL_ENTRY _ZTV5E15x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x4y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x4y7[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x4y7[0]),
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x4y7[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x4y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G15x4y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x4y7[];
static  VTBL_ENTRY _tg__ZTV5E15x4__7G15x4y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x4__7G15x4y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x4__7G15x4y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x4__7G15x4y7[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x4__7G15x4y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x4__7G15x4y7[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x4y7[] = {
  {&(_ZTV7G15x4y7[6]),  6,18},
  {&(_ZTV7G15x4y7[10]),  10,18},
  {&(_ZTV7G15x4y7[13]),  13,18},
  {&(_ZTV7G15x4y7[17]),  17,18},
  {&(_tg__ZTV5E15x4__7G15x4y7[4]),  4,4},
  {&(_tg__ZTV3C155E15x4__7G15x4y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x4__7G15x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x4__7G15x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x4__7G15x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x4__7G15x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x4y7[];
extern  VTBL_ENTRY _ZTV7G15x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x4y7[];
Class_Descriptor cd_G15x4y7 = {  "G15x4y7", // class name
  bases_G15x4y7, 6,
  &(vtc_G15x4y7[0]), // expected_vtbl_contents
  &(vtt_G15x4y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x4y7),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x4y7),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E16x4  : C16 , D0 {
  int fd;
  ~E16x4(); // tgen
  E16x4(); // tgen
};
//SIG(-1 E16x4) C1{ BC2{ BC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E16x4 ::~E16x4(){ note_dtor("E16x4", this);} // tgen
E16x4 ::E16x4(){ note_ctor("E16x4", this);} // tgen

static void Test_E16x4()
{
  extern Class_Descriptor cd_E16x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E16x4, buf);
    E16x4 *dp, &lv = *(dp=new (buf) E16x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E16x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x4)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(8,4), "E16x4");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(12,8), "E16x4");
    check_base_class_offset(lv, (C16*), 0, "E16x4");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E16x4");
    check_field_offset(lv, fd, ABISELECT(24,20), "E16x4.fd");
    test_class_info(&lv, &cd_E16x4);
    dp->~E16x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x4(Test_E16x4, "E16x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E16x4C1Ev();
extern void _ZN5E16x4D1Ev();
Name_Map name_map_E16x4[] = {
  NSPAIR(_ZN5E16x4C1Ev),
  NSPAIR(_ZN5E16x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E16x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E16x4[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_E16x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E16x4[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
Class_Descriptor cd_E16x4 = {  "E16x4", // class name
  bases_E16x4, 4,
  &(vtc_E16x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E16x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E16x4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  1, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y0  : E16x4 , F1 {
  int ff;
  ~G16x4y0(); // tgen
  G16x4y0(); // tgen
};
//SIG(1 G16x4y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x4y0 ::~G16x4y0(){ note_dtor("G16x4y0", this);} // tgen
G16x4y0 ::G16x4y0(){ note_ctor("G16x4y0", this);} // tgen

static void Test_G16x4y0()
{
  extern Class_Descriptor cd_G16x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x4y0, buf);
    G16x4y0 *dp, &lv = *(dp=new (buf) G16x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y0)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(8,4), "G16x4y0");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(12,8), "G16x4y0");
    check_base_class_offset(lv, (C16*)(E16x4*), 0, "G16x4y0");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(20,16), "G16x4y0");
    check_base_class_offset(lv, (E16x4*), 0, "G16x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G16x4y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G16x4y0.ff");
    test_class_info(&lv, &cd_G16x4y0);
    dp->~G16x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y0(Test_G16x4y0, "G16x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x4y0C1Ev();
extern void _ZN7G16x4y0D1Ev();
Name_Map name_map_G16x4y0[] = {
  NSPAIR(_ZN7G16x4y0C1Ev),
  NSPAIR(_ZN7G16x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,24), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y0[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y0[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G16x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G16x4y0[];
extern  VTBL_ENTRY _ZTV7G16x4y0[];
Class_Descriptor cd_G16x4y0 = {  "G16x4y0", // class name
  bases_G16x4y0, 6,
  &(vtc_G16x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y0),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y1  : virtual E16x4 , F1 {
  int ff;
  ~G16x4y1(); // tgen
  G16x4y1(); // tgen
};
//SIG(1 G16x4y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x4y1 ::~G16x4y1(){ note_dtor("G16x4y1", this);} // tgen
G16x4y1 ::G16x4y1(){ note_ctor("G16x4y1", this);} // tgen

static void Test_G16x4y1()
{
  extern Class_Descriptor cd_G16x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x4y1, buf);
    G16x4y1 *dp, &lv = *(dp=new (buf) G16x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y1)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(24,16), "G16x4y1");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(28,20), "G16x4y1");
    check_base_class_offset(lv, (C16*)(E16x4*), ABISELECT(16,12), "G16x4y1");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(36,28), "G16x4y1");
    check_base_class_offset(lv, (E16x4*), ABISELECT(16,12), "G16x4y1");
    check_base_class_offset(lv, (F1*), 0, "G16x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x4y1.ff");
    test_class_info(&lv, &cd_G16x4y1);
    dp->~G16x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y1(Test_G16x4y1, "G16x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x4y1C1Ev();
extern void _ZN7G16x4y1D1Ev();
Name_Map name_map_G16x4y1[] = {
  NSPAIR(_ZN7G16x4y1C1Ev),
  NSPAIR(_ZN7G16x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x4y1[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x4y1[];
static  VTT_ENTRY vtt_G16x4y1[] = {
  {&(_ZTV7G16x4y1[3]),  3,8},
  {&(_ZTV7G16x4y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G16x4y1[];
extern  VTBL_ENTRY _ZTV7G16x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x4y1[];
Class_Descriptor cd_G16x4y1 = {  "G16x4y1", // class name
  bases_G16x4y1, 6,
  &(vtc_G16x4y1[0]), // expected_vtbl_contents
  &(vtt_G16x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x4y1),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y2  : E16x4 , virtual F1 {
  int ff;
  ~G16x4y2(); // tgen
  G16x4y2(); // tgen
};
//SIG(1 G16x4y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x4y2 ::~G16x4y2(){ note_dtor("G16x4y2", this);} // tgen
G16x4y2 ::G16x4y2(){ note_ctor("G16x4y2", this);} // tgen

static void Test_G16x4y2()
{
  extern Class_Descriptor cd_G16x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x4y2, buf);
    G16x4y2 *dp, &lv = *(dp=new (buf) G16x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y2)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(8,4), "G16x4y2");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(12,8), "G16x4y2");
    check_base_class_offset(lv, (C16*)(E16x4*), 0, "G16x4y2");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(20,16), "G16x4y2");
    check_base_class_offset(lv, (E16x4*), 0, "G16x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G16x4y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G16x4y2.ff");
    test_class_info(&lv, &cd_G16x4y2);
    dp->~G16x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y2(Test_G16x4y2, "G16x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x4y2C1Ev();
extern void _ZN7G16x4y2D1Ev();
Name_Map name_map_G16x4y2[] = {
  NSPAIR(_ZN7G16x4y2C1Ev),
  NSPAIR(_ZN7G16x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y2[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x4y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y2[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G16x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x4y2[];
static  VTT_ENTRY vtt_G16x4y2[] = {
  {&(_ZTV7G16x4y2[3]),  3,8},
  {&(_ZTV7G16x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G16x4y2[];
extern  VTBL_ENTRY _ZTV7G16x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x4y2[];
Class_Descriptor cd_G16x4y2 = {  "G16x4y2", // class name
  bases_G16x4y2, 6,
  &(vtc_G16x4y2[0]), // expected_vtbl_contents
  &(vtt_G16x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x4y2),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y3  : virtual E16x4 , virtual F1 {
  int ff;
  ~G16x4y3(); // tgen
  G16x4y3(); // tgen
};
//SIG(1 G16x4y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x4y3 ::~G16x4y3(){ note_dtor("G16x4y3", this);} // tgen
G16x4y3 ::G16x4y3(){ note_ctor("G16x4y3", this);} // tgen

static void Test_G16x4y3()
{
  extern Class_Descriptor cd_G16x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x4y3, buf);
    G16x4y3 *dp, &lv = *(dp=new (buf) G16x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y3)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(24,12), "G16x4y3");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(28,16), "G16x4y3");
    check_base_class_offset(lv, (C16*)(E16x4*), ABISELECT(16,8), "G16x4y3");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(36,24), "G16x4y3");
    check_base_class_offset(lv, (E16x4*), ABISELECT(16,8), "G16x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G16x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x4y3.ff");
    test_class_info(&lv, &cd_G16x4y3);
    dp->~G16x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y3(Test_G16x4y3, "G16x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G16x4y3C1Ev();
extern void _ZN7G16x4y3D1Ev();
Name_Map name_map_G16x4y3[] = {
  NSPAIR(_ZN7G16x4y3C1Ev),
  NSPAIR(_ZN7G16x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y3[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x4y3[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G16x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x4y3[];
static  VTT_ENTRY vtt_G16x4y3[] = {
  {&(_ZTV7G16x4y3[4]),  4,12},
  {&(_ZTV7G16x4y3[7]),  7,12},
  {&(_ZTV7G16x4y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G16x4y3[];
extern  VTBL_ENTRY _ZTV7G16x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x4y3[];
Class_Descriptor cd_G16x4y3 = {  "G16x4y3", // class name
  bases_G16x4y3, 6,
  &(vtc_G16x4y3[0]), // expected_vtbl_contents
  &(vtt_G16x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G16x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x4y3),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y4  : E16x4 , F0 {
  int ff;
  ~G16x4y4(); // tgen
  G16x4y4(); // tgen
};
//SIG(1 G16x4y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G16x4y4 ::~G16x4y4(){ note_dtor("G16x4y4", this);} // tgen
G16x4y4 ::G16x4y4(){ note_ctor("G16x4y4", this);} // tgen

static void Test_G16x4y4()
{
  extern Class_Descriptor cd_G16x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x4y4, buf);
    G16x4y4 *dp, &lv = *(dp=new (buf) G16x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y4)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(8,4), "G16x4y4");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(12,8), "G16x4y4");
    check_base_class_offset(lv, (C16*)(E16x4*), 0, "G16x4y4");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(20,16), "G16x4y4");
    check_base_class_offset(lv, (E16x4*), 0, "G16x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G16x4y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G16x4y4.ff");
    test_class_info(&lv, &cd_G16x4y4);
    dp->~G16x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y4(Test_G16x4y4, "G16x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G16x4y4C1Ev();
extern void _ZN7G16x4y4D1Ev();
Name_Map name_map_G16x4y4[] = {
  NSPAIR(_ZN7G16x4y4C1Ev),
  NSPAIR(_ZN7G16x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y4[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y4[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTI7G16x4y4[];
extern  VTBL_ENTRY _ZTV7G16x4y4[];
Class_Descriptor cd_G16x4y4 = {  "G16x4y4", // class name
  bases_G16x4y4, 6,
  &(vtc_G16x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G16x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y5  : virtual E16x4 , F0 {
  int ff;
  ~G16x4y5(); // tgen
  G16x4y5(); // tgen
};
//SIG(1 G16x4y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G16x4y5 ::~G16x4y5(){ note_dtor("G16x4y5", this);} // tgen
G16x4y5 ::G16x4y5(){ note_ctor("G16x4y5", this);} // tgen

static void Test_G16x4y5()
{
  extern Class_Descriptor cd_G16x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x4y5, buf);
    G16x4y5 *dp, &lv = *(dp=new (buf) G16x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y5)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(24,16), "G16x4y5");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(28,20), "G16x4y5");
    check_base_class_offset(lv, (C16*)(E16x4*), ABISELECT(16,12), "G16x4y5");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(36,28), "G16x4y5");
    check_base_class_offset(lv, (E16x4*), ABISELECT(16,12), "G16x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x4y5.ff");
    test_class_info(&lv, &cd_G16x4y5);
    dp->~G16x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y5(Test_G16x4y5, "G16x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x4y5C1Ev();
extern void _ZN7G16x4y5D1Ev();
Name_Map name_map_G16x4y5[] = {
  NSPAIR(_ZN7G16x4y5C1Ev),
  NSPAIR(_ZN7G16x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y5[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x4y5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x4y5[];
static  VTT_ENTRY vtt_G16x4y5[] = {
  {&(_ZTV7G16x4y5[3]),  3,7},
  {&(_ZTV7G16x4y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G16x4y5[];
extern  VTBL_ENTRY _ZTV7G16x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x4y5[];
Class_Descriptor cd_G16x4y5 = {  "G16x4y5", // class name
  bases_G16x4y5, 6,
  &(vtc_G16x4y5[0]), // expected_vtbl_contents
  &(vtt_G16x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x4y5),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y6  : E16x4 , virtual F0 {
  int ff;
  ~G16x4y6(); // tgen
  G16x4y6(); // tgen
};
//SIG(1 G16x4y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x4y6 ::~G16x4y6(){ note_dtor("G16x4y6", this);} // tgen
G16x4y6 ::G16x4y6(){ note_ctor("G16x4y6", this);} // tgen

static void Test_G16x4y6()
{
  extern Class_Descriptor cd_G16x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x4y6, buf);
    G16x4y6 *dp, &lv = *(dp=new (buf) G16x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y6)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(8,4), "G16x4y6");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(12,8), "G16x4y6");
    check_base_class_offset(lv, (C16*)(E16x4*), 0, "G16x4y6");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(20,16), "G16x4y6");
    check_base_class_offset(lv, (E16x4*), 0, "G16x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G16x4y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G16x4y6.ff");
    test_class_info(&lv, &cd_G16x4y6);
    dp->~G16x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y6(Test_G16x4y6, "G16x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G16x4y6C1Ev();
extern void _ZN7G16x4y6D1Ev();
Name_Map name_map_G16x4y6[] = {
  NSPAIR(_ZN7G16x4y6C1Ev),
  NSPAIR(_ZN7G16x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y6[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x4y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x4y6[];
static  VTT_ENTRY vtt_G16x4y6[] = {
  {&(_ZTV7G16x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x4y6[];
extern  VTBL_ENTRY _ZTV7G16x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x4y6[];
Class_Descriptor cd_G16x4y6 = {  "G16x4y6", // class name
  bases_G16x4y6, 6,
  &(vtc_G16x4y6[0]), // expected_vtbl_contents
  &(vtt_G16x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G16x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x4y6),1, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x4y7  : virtual E16x4 , virtual F0 {
  int ff;
  ~G16x4y7(); // tgen
  G16x4y7(); // tgen
};
//SIG(1 G16x4y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x4y7 ::~G16x4y7(){ note_dtor("G16x4y7", this);} // tgen
G16x4y7 ::G16x4y7(){ note_ctor("G16x4y7", this);} // tgen

static void Test_G16x4y7()
{
  extern Class_Descriptor cd_G16x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x4y7, buf);
    G16x4y7 *dp, &lv = *(dp=new (buf) G16x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x4y7)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x4*), ABISELECT(24,12), "G16x4y7");
    check_base_class_offset(lv, (B0*)(C16*)(E16x4*), ABISELECT(28,16), "G16x4y7");
    check_base_class_offset(lv, (C16*)(E16x4*), ABISELECT(16,8), "G16x4y7");
    check_base_class_offset(lv, (D0*)(E16x4*), ABISELECT(36,24), "G16x4y7");
    check_base_class_offset(lv, (E16x4*), ABISELECT(16,8), "G16x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G16x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x4y7.ff");
    test_class_info(&lv, &cd_G16x4y7);
    dp->~G16x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x4y7(Test_G16x4y7, "G16x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x4y7C1Ev();
extern void _ZN7G16x4y7D1Ev();
Name_Map name_map_G16x4y7[] = {
  NSPAIR(_ZN7G16x4y7C1Ev),
  NSPAIR(_ZN7G16x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x4;
extern VTBL_ENTRY _ZTI5E16x4[];
extern  VTBL_ENTRY _ZTV5E16x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x4y7[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x4y7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x4y7[];
static  VTT_ENTRY vtt_G16x4y7[] = {
  {&(_ZTV7G16x4y7[4]),  4,8},
  {&(_ZTV7G16x4y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G16x4y7[];
extern  VTBL_ENTRY _ZTV7G16x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x4y7[];
Class_Descriptor cd_G16x4y7 = {  "G16x4y7", // class name
  bases_G16x4y7, 6,
  &(vtc_G16x4y7[0]), // expected_vtbl_contents
  &(vtt_G16x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x4y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x4y7),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E17x4  : C17 , D0 {
  int fd;
  ~E17x4(); // tgen
  E17x4(); // tgen
};
//SIG(-1 E17x4) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E17x4 ::~E17x4(){ note_dtor("E17x4", this);} // tgen
E17x4 ::E17x4(){ note_ctor("E17x4", this);} // tgen

static void Test_E17x4()
{
  extern Class_Descriptor cd_E17x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E17x4, buf);
    E17x4 *dp, &lv = *(dp=new (buf) E17x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E17x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x4)");
    check_base_class_offset(lv, (A1*)(C17*), 0, "E17x4");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(12,8), "E17x4");
    check_base_class_offset(lv, (C17*), 0, "E17x4");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E17x4");
    check_field_offset(lv, fd, ABISELECT(24,20), "E17x4.fd");
    test_class_info(&lv, &cd_E17x4);
    dp->~E17x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x4(Test_E17x4, "E17x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E17x4C1Ev();
extern void _ZN5E17x4D1Ev();
Name_Map name_map_E17x4[] = {
  NSPAIR(_ZN5E17x4C1Ev),
  NSPAIR(_ZN5E17x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E17x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E17x4[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_E17x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E17x4[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
Class_Descriptor cd_E17x4 = {  "E17x4", // class name
  bases_E17x4, 4,
  &(vtc_E17x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E17x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E17x4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y0  : E17x4 , F1 {
  int ff;
  ~G17x4y0(); // tgen
  G17x4y0(); // tgen
};
//SIG(1 G17x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x4y0 ::~G17x4y0(){ note_dtor("G17x4y0", this);} // tgen
G17x4y0 ::G17x4y0(){ note_ctor("G17x4y0", this);} // tgen

static void Test_G17x4y0()
{
  extern Class_Descriptor cd_G17x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x4y0, buf);
    G17x4y0 *dp, &lv = *(dp=new (buf) G17x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y0)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), 0, "G17x4y0");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(12,8), "G17x4y0");
    check_base_class_offset(lv, (C17*)(E17x4*), 0, "G17x4y0");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(20,16), "G17x4y0");
    check_base_class_offset(lv, (E17x4*), 0, "G17x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G17x4y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G17x4y0.ff");
    test_class_info(&lv, &cd_G17x4y0);
    dp->~G17x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y0(Test_G17x4y0, "G17x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x4y0C1Ev();
extern void _ZN7G17x4y0D1Ev();
Name_Map name_map_G17x4y0[] = {
  NSPAIR(_ZN7G17x4y0C1Ev),
  NSPAIR(_ZN7G17x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,24), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y0[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y0[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G17x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G17x4y0[];
extern  VTBL_ENTRY _ZTV7G17x4y0[];
Class_Descriptor cd_G17x4y0 = {  "G17x4y0", // class name
  bases_G17x4y0, 6,
  &(vtc_G17x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y0),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y1  : virtual E17x4 , F1 {
  int ff;
  ~G17x4y1(); // tgen
  G17x4y1(); // tgen
};
//SIG(1 G17x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x4y1 ::~G17x4y1(){ note_dtor("G17x4y1", this);} // tgen
G17x4y1 ::G17x4y1(){ note_ctor("G17x4y1", this);} // tgen

static void Test_G17x4y1()
{
  extern Class_Descriptor cd_G17x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x4y1, buf);
    G17x4y1 *dp, &lv = *(dp=new (buf) G17x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y1)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), ABISELECT(16,12), "G17x4y1");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(28,20), "G17x4y1");
    check_base_class_offset(lv, (C17*)(E17x4*), ABISELECT(16,12), "G17x4y1");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(36,28), "G17x4y1");
    check_base_class_offset(lv, (E17x4*), ABISELECT(16,12), "G17x4y1");
    check_base_class_offset(lv, (F1*), 0, "G17x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x4y1.ff");
    test_class_info(&lv, &cd_G17x4y1);
    dp->~G17x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y1(Test_G17x4y1, "G17x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x4y1C1Ev();
extern void _ZN7G17x4y1D1Ev();
Name_Map name_map_G17x4y1[] = {
  NSPAIR(_ZN7G17x4y1C1Ev),
  NSPAIR(_ZN7G17x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x4y1[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x4y1[];
static  VTT_ENTRY vtt_G17x4y1[] = {
  {&(_ZTV7G17x4y1[3]),  3,8},
  {&(_ZTV7G17x4y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G17x4y1[];
extern  VTBL_ENTRY _ZTV7G17x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x4y1[];
Class_Descriptor cd_G17x4y1 = {  "G17x4y1", // class name
  bases_G17x4y1, 6,
  &(vtc_G17x4y1[0]), // expected_vtbl_contents
  &(vtt_G17x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x4y1),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y2  : E17x4 , virtual F1 {
  int ff;
  ~G17x4y2(); // tgen
  G17x4y2(); // tgen
};
//SIG(1 G17x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x4y2 ::~G17x4y2(){ note_dtor("G17x4y2", this);} // tgen
G17x4y2 ::G17x4y2(){ note_ctor("G17x4y2", this);} // tgen

static void Test_G17x4y2()
{
  extern Class_Descriptor cd_G17x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x4y2, buf);
    G17x4y2 *dp, &lv = *(dp=new (buf) G17x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y2)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), 0, "G17x4y2");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(12,8), "G17x4y2");
    check_base_class_offset(lv, (C17*)(E17x4*), 0, "G17x4y2");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(20,16), "G17x4y2");
    check_base_class_offset(lv, (E17x4*), 0, "G17x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G17x4y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G17x4y2.ff");
    test_class_info(&lv, &cd_G17x4y2);
    dp->~G17x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y2(Test_G17x4y2, "G17x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x4y2C1Ev();
extern void _ZN7G17x4y2D1Ev();
Name_Map name_map_G17x4y2[] = {
  NSPAIR(_ZN7G17x4y2C1Ev),
  NSPAIR(_ZN7G17x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y2[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x4y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y2[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G17x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x4y2[];
static  VTT_ENTRY vtt_G17x4y2[] = {
  {&(_ZTV7G17x4y2[3]),  3,8},
  {&(_ZTV7G17x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G17x4y2[];
extern  VTBL_ENTRY _ZTV7G17x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x4y2[];
Class_Descriptor cd_G17x4y2 = {  "G17x4y2", // class name
  bases_G17x4y2, 6,
  &(vtc_G17x4y2[0]), // expected_vtbl_contents
  &(vtt_G17x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x4y2),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y3  : virtual E17x4 , virtual F1 {
  int ff;
  ~G17x4y3(); // tgen
  G17x4y3(); // tgen
};
//SIG(1 G17x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x4y3 ::~G17x4y3(){ note_dtor("G17x4y3", this);} // tgen
G17x4y3 ::G17x4y3(){ note_ctor("G17x4y3", this);} // tgen

static void Test_G17x4y3()
{
  extern Class_Descriptor cd_G17x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x4y3, buf);
    G17x4y3 *dp, &lv = *(dp=new (buf) G17x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y3)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), ABISELECT(16,8), "G17x4y3");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(28,16), "G17x4y3");
    check_base_class_offset(lv, (C17*)(E17x4*), ABISELECT(16,8), "G17x4y3");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(36,24), "G17x4y3");
    check_base_class_offset(lv, (E17x4*), ABISELECT(16,8), "G17x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G17x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x4y3.ff");
    test_class_info(&lv, &cd_G17x4y3);
    dp->~G17x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y3(Test_G17x4y3, "G17x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G17x4y3C1Ev();
extern void _ZN7G17x4y3D1Ev();
Name_Map name_map_G17x4y3[] = {
  NSPAIR(_ZN7G17x4y3C1Ev),
  NSPAIR(_ZN7G17x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y3[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x4y3[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G17x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x4y3[];
static  VTT_ENTRY vtt_G17x4y3[] = {
  {&(_ZTV7G17x4y3[4]),  4,12},
  {&(_ZTV7G17x4y3[7]),  7,12},
  {&(_ZTV7G17x4y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G17x4y3[];
extern  VTBL_ENTRY _ZTV7G17x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x4y3[];
Class_Descriptor cd_G17x4y3 = {  "G17x4y3", // class name
  bases_G17x4y3, 6,
  &(vtc_G17x4y3[0]), // expected_vtbl_contents
  &(vtt_G17x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G17x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x4y3),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y4  : E17x4 , F0 {
  int ff;
  ~G17x4y4(); // tgen
  G17x4y4(); // tgen
};
//SIG(1 G17x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G17x4y4 ::~G17x4y4(){ note_dtor("G17x4y4", this);} // tgen
G17x4y4 ::G17x4y4(){ note_ctor("G17x4y4", this);} // tgen

static void Test_G17x4y4()
{
  extern Class_Descriptor cd_G17x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x4y4, buf);
    G17x4y4 *dp, &lv = *(dp=new (buf) G17x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y4)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), 0, "G17x4y4");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(12,8), "G17x4y4");
    check_base_class_offset(lv, (C17*)(E17x4*), 0, "G17x4y4");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(20,16), "G17x4y4");
    check_base_class_offset(lv, (E17x4*), 0, "G17x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G17x4y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G17x4y4.ff");
    test_class_info(&lv, &cd_G17x4y4);
    dp->~G17x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y4(Test_G17x4y4, "G17x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G17x4y4C1Ev();
extern void _ZN7G17x4y4D1Ev();
Name_Map name_map_G17x4y4[] = {
  NSPAIR(_ZN7G17x4y4C1Ev),
  NSPAIR(_ZN7G17x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y4[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y4[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTI7G17x4y4[];
extern  VTBL_ENTRY _ZTV7G17x4y4[];
Class_Descriptor cd_G17x4y4 = {  "G17x4y4", // class name
  bases_G17x4y4, 6,
  &(vtc_G17x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G17x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y5  : virtual E17x4 , F0 {
  int ff;
  ~G17x4y5(); // tgen
  G17x4y5(); // tgen
};
//SIG(1 G17x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G17x4y5 ::~G17x4y5(){ note_dtor("G17x4y5", this);} // tgen
G17x4y5 ::G17x4y5(){ note_ctor("G17x4y5", this);} // tgen

static void Test_G17x4y5()
{
  extern Class_Descriptor cd_G17x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x4y5, buf);
    G17x4y5 *dp, &lv = *(dp=new (buf) G17x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y5)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), ABISELECT(16,12), "G17x4y5");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(28,20), "G17x4y5");
    check_base_class_offset(lv, (C17*)(E17x4*), ABISELECT(16,12), "G17x4y5");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(36,28), "G17x4y5");
    check_base_class_offset(lv, (E17x4*), ABISELECT(16,12), "G17x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x4y5.ff");
    test_class_info(&lv, &cd_G17x4y5);
    dp->~G17x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y5(Test_G17x4y5, "G17x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x4y5C1Ev();
extern void _ZN7G17x4y5D1Ev();
Name_Map name_map_G17x4y5[] = {
  NSPAIR(_ZN7G17x4y5C1Ev),
  NSPAIR(_ZN7G17x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y5[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x4y5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x4y5[];
static  VTT_ENTRY vtt_G17x4y5[] = {
  {&(_ZTV7G17x4y5[3]),  3,7},
  {&(_ZTV7G17x4y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G17x4y5[];
extern  VTBL_ENTRY _ZTV7G17x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x4y5[];
Class_Descriptor cd_G17x4y5 = {  "G17x4y5", // class name
  bases_G17x4y5, 6,
  &(vtc_G17x4y5[0]), // expected_vtbl_contents
  &(vtt_G17x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x4y5),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y6  : E17x4 , virtual F0 {
  int ff;
  ~G17x4y6(); // tgen
  G17x4y6(); // tgen
};
//SIG(1 G17x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x4y6 ::~G17x4y6(){ note_dtor("G17x4y6", this);} // tgen
G17x4y6 ::G17x4y6(){ note_ctor("G17x4y6", this);} // tgen

static void Test_G17x4y6()
{
  extern Class_Descriptor cd_G17x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x4y6, buf);
    G17x4y6 *dp, &lv = *(dp=new (buf) G17x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y6)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), 0, "G17x4y6");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(12,8), "G17x4y6");
    check_base_class_offset(lv, (C17*)(E17x4*), 0, "G17x4y6");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(20,16), "G17x4y6");
    check_base_class_offset(lv, (E17x4*), 0, "G17x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G17x4y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G17x4y6.ff");
    test_class_info(&lv, &cd_G17x4y6);
    dp->~G17x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y6(Test_G17x4y6, "G17x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G17x4y6C1Ev();
extern void _ZN7G17x4y6D1Ev();
Name_Map name_map_G17x4y6[] = {
  NSPAIR(_ZN7G17x4y6C1Ev),
  NSPAIR(_ZN7G17x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y6[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x4y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x4y6[];
static  VTT_ENTRY vtt_G17x4y6[] = {
  {&(_ZTV7G17x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x4y6[];
extern  VTBL_ENTRY _ZTV7G17x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x4y6[];
Class_Descriptor cd_G17x4y6 = {  "G17x4y6", // class name
  bases_G17x4y6, 6,
  &(vtc_G17x4y6[0]), // expected_vtbl_contents
  &(vtt_G17x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G17x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x4y6),1, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x4y7  : virtual E17x4 , virtual F0 {
  int ff;
  ~G17x4y7(); // tgen
  G17x4y7(); // tgen
};
//SIG(1 G17x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x4y7 ::~G17x4y7(){ note_dtor("G17x4y7", this);} // tgen
G17x4y7 ::G17x4y7(){ note_ctor("G17x4y7", this);} // tgen

static void Test_G17x4y7()
{
  extern Class_Descriptor cd_G17x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x4y7, buf);
    G17x4y7 *dp, &lv = *(dp=new (buf) G17x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x4y7)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x4*), ABISELECT(16,8), "G17x4y7");
    check_base_class_offset(lv, (B0*)(C17*)(E17x4*), ABISELECT(28,16), "G17x4y7");
    check_base_class_offset(lv, (C17*)(E17x4*), ABISELECT(16,8), "G17x4y7");
    check_base_class_offset(lv, (D0*)(E17x4*), ABISELECT(36,24), "G17x4y7");
    check_base_class_offset(lv, (E17x4*), ABISELECT(16,8), "G17x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G17x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x4y7.ff");
    test_class_info(&lv, &cd_G17x4y7);
    dp->~G17x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x4y7(Test_G17x4y7, "G17x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x4y7C1Ev();
extern void _ZN7G17x4y7D1Ev();
Name_Map name_map_G17x4y7[] = {
  NSPAIR(_ZN7G17x4y7C1Ev),
  NSPAIR(_ZN7G17x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x4;
extern VTBL_ENTRY _ZTI5E17x4[];
extern  VTBL_ENTRY _ZTV5E17x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x4y7[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x4y7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x4y7[];
static  VTT_ENTRY vtt_G17x4y7[] = {
  {&(_ZTV7G17x4y7[4]),  4,8},
  {&(_ZTV7G17x4y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G17x4y7[];
extern  VTBL_ENTRY _ZTV7G17x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x4y7[];
Class_Descriptor cd_G17x4y7 = {  "G17x4y7", // class name
  bases_G17x4y7, 6,
  &(vtc_G17x4y7[0]), // expected_vtbl_contents
  &(vtt_G17x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x4y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x4y7),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E18x4  : C18 , D0 {
  int fd;
  ~E18x4(); // tgen
  E18x4(); // tgen
};
//SIG(-1 E18x4) C1{ BC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E18x4 ::~E18x4(){ note_dtor("E18x4", this);} // tgen
E18x4 ::E18x4(){ note_ctor("E18x4", this);} // tgen

static void Test_E18x4()
{
  extern Class_Descriptor cd_E18x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E18x4, buf);
    E18x4 *dp, &lv = *(dp=new (buf) E18x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E18x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x4)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(24,20), "E18x4");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(8,4), "E18x4");
    check_base_class_offset(lv, (C18*), 0, "E18x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E18x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E18x4.fd");
    test_class_info(&lv, &cd_E18x4);
    dp->~E18x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x4(Test_E18x4, "E18x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E18x4C1Ev();
extern void _ZN5E18x4D1Ev();
Name_Map name_map_E18x4[] = {
  NSPAIR(_ZN5E18x4C1Ev),
  NSPAIR(_ZN5E18x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E18x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E18x4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_E18x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV5E18x4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x4[] = {
  {&(_ZTV5E18x4[3]),  3,4},
  {&(_tg__ZTV3C18__5E18x4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
Class_Descriptor cd_E18x4 = {  "E18x4", // class name
  bases_E18x4, 4,
  &(vtc_E18x4[0]), // expected_vtbl_contents
  &(vtt_E18x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E18x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E18x4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E18x4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y0  : E18x4 , F1 {
  int ff;
  ~G18x4y0(); // tgen
  G18x4y0(); // tgen
};
//SIG(1 G18x4y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x4y0 ::~G18x4y0(){ note_dtor("G18x4y0", this);} // tgen
G18x4y0 ::G18x4y0(){ note_ctor("G18x4y0", this);} // tgen

static void Test_G18x4y0()
{
  extern Class_Descriptor cd_G18x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x4y0, buf);
    G18x4y0 *dp, &lv = *(dp=new (buf) G18x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y0)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(40,32), "G18x4y0");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(8,4), "G18x4y0");
    check_base_class_offset(lv, (C18*)(E18x4*), 0, "G18x4y0");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(16,12), "G18x4y0");
    check_base_class_offset(lv, (E18x4*), 0, "G18x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G18x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G18x4y0.ff");
    test_class_info(&lv, &cd_G18x4y0);
    dp->~G18x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y0(Test_G18x4y0, "G18x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x4y0C1Ev();
extern void _ZN7G18x4y0D1Ev();
Name_Map name_map_G18x4y0[] = {
  NSPAIR(_ZN7G18x4y0C1Ev),
  NSPAIR(_ZN7G18x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y0[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y0[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G18x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y0[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y0[] = {
  {&(_ZTV7G18x4y0[3]),  3,7},
  {&(_tg__ZTV5E18x4__7G18x4y0[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y0[];
extern  VTBL_ENTRY _ZTV7G18x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y0[];
Class_Descriptor cd_G18x4y0 = {  "G18x4y0", // class name
  bases_G18x4y0, 6,
  &(vtc_G18x4y0[0]), // expected_vtbl_contents
  &(vtt_G18x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y1  : virtual E18x4 , F1 {
  int ff;
  ~G18x4y1(); // tgen
  G18x4y1(); // tgen
};
//SIG(1 G18x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x4y1 ::~G18x4y1(){ note_dtor("G18x4y1", this);} // tgen
G18x4y1 ::G18x4y1(){ note_ctor("G18x4y1", this);} // tgen

static void Test_G18x4y1()
{
  extern Class_Descriptor cd_G18x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x4y1, buf);
    G18x4y1 *dp, &lv = *(dp=new (buf) G18x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y1)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(40,32), "G18x4y1");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(24,16), "G18x4y1");
    check_base_class_offset(lv, (C18*)(E18x4*), ABISELECT(16,12), "G18x4y1");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(32,24), "G18x4y1");
    check_base_class_offset(lv, (E18x4*), ABISELECT(16,12), "G18x4y1");
    check_base_class_offset(lv, (F1*), 0, "G18x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x4y1.ff");
    test_class_info(&lv, &cd_G18x4y1);
    dp->~G18x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y1(Test_G18x4y1, "G18x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x4y1C1Ev();
extern void _ZN7G18x4y1D1Ev();
Name_Map name_map_G18x4y1[] = {
  NSPAIR(_ZN7G18x4y1C1Ev),
  NSPAIR(_ZN7G18x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x4y1[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y1[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y1[] = {
  {&(_ZTV7G18x4y1[4]),  4,10},
  {&(_ZTV7G18x4y1[9]),  9,10},
  {&(_tg__ZTV5E18x4__7G18x4y1[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y1[];
extern  VTBL_ENTRY _ZTV7G18x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y1[];
Class_Descriptor cd_G18x4y1 = {  "G18x4y1", // class name
  bases_G18x4y1, 6,
  &(vtc_G18x4y1[0]), // expected_vtbl_contents
  &(vtt_G18x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y2  : E18x4 , virtual F1 {
  int ff;
  ~G18x4y2(); // tgen
  G18x4y2(); // tgen
};
//SIG(1 G18x4y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x4y2 ::~G18x4y2(){ note_dtor("G18x4y2", this);} // tgen
G18x4y2 ::G18x4y2(){ note_ctor("G18x4y2", this);} // tgen

static void Test_G18x4y2()
{
  extern Class_Descriptor cd_G18x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x4y2, buf);
    G18x4y2 *dp, &lv = *(dp=new (buf) G18x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y2)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(28,24), "G18x4y2");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(8,4), "G18x4y2");
    check_base_class_offset(lv, (C18*)(E18x4*), 0, "G18x4y2");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(16,12), "G18x4y2");
    check_base_class_offset(lv, (E18x4*), 0, "G18x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G18x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G18x4y2.ff");
    test_class_info(&lv, &cd_G18x4y2);
    dp->~G18x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y2(Test_G18x4y2, "G18x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x4y2C1Ev();
extern void _ZN7G18x4y2D1Ev();
Name_Map name_map_G18x4y2[] = {
  NSPAIR(_ZN7G18x4y2C1Ev),
  NSPAIR(_ZN7G18x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y2[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y2[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G18x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y2[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y2[] = {
  {&(_ZTV7G18x4y2[4]),  4,9},
  {&(_tg__ZTV5E18x4__7G18x4y2[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y2[3]),  3,4},
  {&(_ZTV7G18x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G18x4y2[];
extern  VTBL_ENTRY _ZTV7G18x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y2[];
Class_Descriptor cd_G18x4y2 = {  "G18x4y2", // class name
  bases_G18x4y2, 6,
  &(vtc_G18x4y2[0]), // expected_vtbl_contents
  &(vtt_G18x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y3  : virtual E18x4 , virtual F1 {
  int ff;
  ~G18x4y3(); // tgen
  G18x4y3(); // tgen
};
//SIG(1 G18x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x4y3 ::~G18x4y3(){ note_dtor("G18x4y3", this);} // tgen
G18x4y3 ::G18x4y3(){ note_ctor("G18x4y3", this);} // tgen

static void Test_G18x4y3()
{
  extern Class_Descriptor cd_G18x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x4y3, buf);
    G18x4y3 *dp, &lv = *(dp=new (buf) G18x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y3)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(40,28), "G18x4y3");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(24,12), "G18x4y3");
    check_base_class_offset(lv, (C18*)(E18x4*), ABISELECT(16,8), "G18x4y3");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(32,20), "G18x4y3");
    check_base_class_offset(lv, (E18x4*), ABISELECT(16,8), "G18x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G18x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x4y3.ff");
    test_class_info(&lv, &cd_G18x4y3);
    dp->~G18x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y3(Test_G18x4y3, "G18x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G18x4y3C1Ev();
extern void _ZN7G18x4y3D1Ev();
Name_Map name_map_G18x4y3[] = {
  NSPAIR(_ZN7G18x4y3C1Ev),
  NSPAIR(_ZN7G18x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y3[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x4y3[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G18x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y3[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y3[] = {
  {&(_ZTV7G18x4y3[5]),  5,14},
  {&(_ZTV7G18x4y3[9]),  9,14},
  {&(_ZTV7G18x4y3[13]),  13,14},
  {&(_tg__ZTV5E18x4__7G18x4y3[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y3[];
extern  VTBL_ENTRY _ZTV7G18x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y3[];
Class_Descriptor cd_G18x4y3 = {  "G18x4y3", // class name
  bases_G18x4y3, 6,
  &(vtc_G18x4y3[0]), // expected_vtbl_contents
  &(vtt_G18x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G18x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y4  : E18x4 , F0 {
  int ff;
  ~G18x4y4(); // tgen
  G18x4y4(); // tgen
};
//SIG(1 G18x4y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G18x4y4 ::~G18x4y4(){ note_dtor("G18x4y4", this);} // tgen
G18x4y4 ::G18x4y4(){ note_ctor("G18x4y4", this);} // tgen

static void Test_G18x4y4()
{
  extern Class_Descriptor cd_G18x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x4y4, buf);
    G18x4y4 *dp, &lv = *(dp=new (buf) G18x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y4)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(32,28), "G18x4y4");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(8,4), "G18x4y4");
    check_base_class_offset(lv, (C18*)(E18x4*), 0, "G18x4y4");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(16,12), "G18x4y4");
    check_base_class_offset(lv, (E18x4*), 0, "G18x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G18x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G18x4y4.ff");
    test_class_info(&lv, &cd_G18x4y4);
    dp->~G18x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y4(Test_G18x4y4, "G18x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G18x4y4C1Ev();
extern void _ZN7G18x4y4D1Ev();
Name_Map name_map_G18x4y4[] = {
  NSPAIR(_ZN7G18x4y4C1Ev),
  NSPAIR(_ZN7G18x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y4[] = {
  {&(_ZTV7G18x4y4[3]),  3,4},
  {&(_tg__ZTV5E18x4__7G18x4y4[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y4[];
extern  VTBL_ENTRY _ZTV7G18x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y4[];
Class_Descriptor cd_G18x4y4 = {  "G18x4y4", // class name
  bases_G18x4y4, 6,
  &(vtc_G18x4y4[0]), // expected_vtbl_contents
  &(vtt_G18x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G18x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y5  : virtual E18x4 , F0 {
  int ff;
  ~G18x4y5(); // tgen
  G18x4y5(); // tgen
};
//SIG(1 G18x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G18x4y5 ::~G18x4y5(){ note_dtor("G18x4y5", this);} // tgen
G18x4y5 ::G18x4y5(){ note_ctor("G18x4y5", this);} // tgen

static void Test_G18x4y5()
{
  extern Class_Descriptor cd_G18x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x4y5, buf);
    G18x4y5 *dp, &lv = *(dp=new (buf) G18x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y5)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(40,32), "G18x4y5");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(24,16), "G18x4y5");
    check_base_class_offset(lv, (C18*)(E18x4*), ABISELECT(16,12), "G18x4y5");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(32,24), "G18x4y5");
    check_base_class_offset(lv, (E18x4*), ABISELECT(16,12), "G18x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x4y5.ff");
    test_class_info(&lv, &cd_G18x4y5);
    dp->~G18x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y5(Test_G18x4y5, "G18x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x4y5C1Ev();
extern void _ZN7G18x4y5D1Ev();
Name_Map name_map_G18x4y5[] = {
  NSPAIR(_ZN7G18x4y5C1Ev),
  NSPAIR(_ZN7G18x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x4y5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y5[] = {
  {&(_ZTV7G18x4y5[4]),  4,9},
  {&(_ZTV7G18x4y5[8]),  8,9},
  {&(_tg__ZTV5E18x4__7G18x4y5[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y5[];
extern  VTBL_ENTRY _ZTV7G18x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y5[];
Class_Descriptor cd_G18x4y5 = {  "G18x4y5", // class name
  bases_G18x4y5, 6,
  &(vtc_G18x4y5[0]), // expected_vtbl_contents
  &(vtt_G18x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y6  : E18x4 , virtual F0 {
  int ff;
  ~G18x4y6(); // tgen
  G18x4y6(); // tgen
};
//SIG(1 G18x4y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x4y6 ::~G18x4y6(){ note_dtor("G18x4y6", this);} // tgen
G18x4y6 ::G18x4y6(){ note_ctor("G18x4y6", this);} // tgen

static void Test_G18x4y6()
{
  extern Class_Descriptor cd_G18x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x4y6, buf);
    G18x4y6 *dp, &lv = *(dp=new (buf) G18x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y6)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(28,24), "G18x4y6");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(8,4), "G18x4y6");
    check_base_class_offset(lv, (C18*)(E18x4*), 0, "G18x4y6");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(16,12), "G18x4y6");
    check_base_class_offset(lv, (E18x4*), 0, "G18x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G18x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G18x4y6.ff");
    test_class_info(&lv, &cd_G18x4y6);
    dp->~G18x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y6(Test_G18x4y6, "G18x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G18x4y6C1Ev();
extern void _ZN7G18x4y6D1Ev();
Name_Map name_map_G18x4y6[] = {
  NSPAIR(_ZN7G18x4y6C1Ev),
  NSPAIR(_ZN7G18x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y6[] = {
  {&(_ZTV7G18x4y6[4]),  4,5},
  {&(_tg__ZTV5E18x4__7G18x4y6[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y6[];
extern  VTBL_ENTRY _ZTV7G18x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y6[];
Class_Descriptor cd_G18x4y6 = {  "G18x4y6", // class name
  bases_G18x4y6, 6,
  &(vtc_G18x4y6[0]), // expected_vtbl_contents
  &(vtt_G18x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G18x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x4y7  : virtual E18x4 , virtual F0 {
  int ff;
  ~G18x4y7(); // tgen
  G18x4y7(); // tgen
};
//SIG(1 G18x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x4y7 ::~G18x4y7(){ note_dtor("G18x4y7", this);} // tgen
G18x4y7 ::G18x4y7(){ note_ctor("G18x4y7", this);} // tgen

static void Test_G18x4y7()
{
  extern Class_Descriptor cd_G18x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x4y7, buf);
    G18x4y7 *dp, &lv = *(dp=new (buf) G18x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x4y7)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x4*), ABISELECT(40,28), "G18x4y7");
    check_base_class_offset(lv, (B0*)(C18*)(E18x4*), ABISELECT(24,12), "G18x4y7");
    check_base_class_offset(lv, (C18*)(E18x4*), ABISELECT(16,8), "G18x4y7");
    check_base_class_offset(lv, (D0*)(E18x4*), ABISELECT(32,20), "G18x4y7");
    check_base_class_offset(lv, (E18x4*), ABISELECT(16,8), "G18x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G18x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x4y7.ff");
    test_class_info(&lv, &cd_G18x4y7);
    dp->~G18x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x4y7(Test_G18x4y7, "G18x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x4y7C1Ev();
extern void _ZN7G18x4y7D1Ev();
Name_Map name_map_G18x4y7[] = {
  NSPAIR(_ZN7G18x4y7C1Ev),
  NSPAIR(_ZN7G18x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x4;
extern VTBL_ENTRY _ZTI5E18x4[];
extern  VTBL_ENTRY _ZTV5E18x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x4y7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x4y7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x4y7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x4__7G18x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x4__7G18x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x4y7[] = {
  {&(_ZTV7G18x4y7[5]),  5,10},
  {&(_ZTV7G18x4y7[9]),  9,10},
  {&(_tg__ZTV5E18x4__7G18x4y7[3]),  3,4},
  {&(_tg__ZTV3C185E18x4__7G18x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x4y7[];
extern  VTBL_ENTRY _ZTV7G18x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x4y7[];
Class_Descriptor cd_G18x4y7 = {  "G18x4y7", // class name
  bases_G18x4y7, 6,
  &(vtc_G18x4y7[0]), // expected_vtbl_contents
  &(vtt_G18x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x4y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x4y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E19x4  : C19 , D0 {
  int fd;
  ~E19x4(); // tgen
  E19x4(); // tgen
};
//SIG(-1 E19x4) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E19x4 ::~E19x4(){ note_dtor("E19x4", this);} // tgen
E19x4 ::E19x4(){ note_ctor("E19x4", this);} // tgen

static void Test_E19x4()
{
  extern Class_Descriptor cd_E19x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E19x4, buf);
    E19x4 *dp, &lv = *(dp=new (buf) E19x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E19x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x4)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(24,20), "E19x4");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(8,4), "E19x4");
    check_base_class_offset(lv, (C19*), 0, "E19x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E19x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E19x4.fd");
    test_class_info(&lv, &cd_E19x4);
    dp->~E19x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x4(Test_E19x4, "E19x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E19x4C1Ev();
extern void _ZN5E19x4D1Ev();
Name_Map name_map_E19x4[] = {
  NSPAIR(_ZN5E19x4C1Ev),
  NSPAIR(_ZN5E19x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E19x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E19x4[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV5E19x4[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__5E19x4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x4[] = {
  {&(_ZTV5E19x4[3]),  3,8},
  {&(_tg__ZTV3C19__5E19x4[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__5E19x4[3]),  3,4},
  {&(_ZTV5E19x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
static VTBL_ENTRY alt_thunk_names8[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x4 = {  "E19x4", // class name
  bases_E19x4, 4,
  &(vtc_E19x4[0]), // expected_vtbl_contents
  &(vtt_E19x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E19x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E19x4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E19x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names8,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y0  : E19x4 , F1 {
  int ff;
  ~G19x4y0(); // tgen
  G19x4y0(); // tgen
};
//SIG(1 G19x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x4y0 ::~G19x4y0(){ note_dtor("G19x4y0", this);} // tgen
G19x4y0 ::G19x4y0(){ note_ctor("G19x4y0", this);} // tgen

static void Test_G19x4y0()
{
  extern Class_Descriptor cd_G19x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x4y0, buf);
    G19x4y0 *dp, &lv = *(dp=new (buf) G19x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y0)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(40,32), "G19x4y0");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(8,4), "G19x4y0");
    check_base_class_offset(lv, (C19*)(E19x4*), 0, "G19x4y0");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(16,12), "G19x4y0");
    check_base_class_offset(lv, (E19x4*), 0, "G19x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G19x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G19x4y0.ff");
    test_class_info(&lv, &cd_G19x4y0);
    dp->~G19x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y0(Test_G19x4y0, "G19x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x4y0C1Ev();
extern void _ZN7G19x4y0D1Ev();
Name_Map name_map_G19x4y0[] = {
  NSPAIR(_ZN7G19x4y0C1Ev),
  NSPAIR(_ZN7G19x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y0[];
extern void _ZN3C193fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y0[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G19x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G19x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x4y0[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y0[] = {
  {&(_ZTV7G19x4y0[3]),  3,11},
  {&(_tg__ZTV5E19x4__7G19x4y0[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y0[3]),  3,4},
  {&(_ZTV7G19x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G19x4y0[];
extern  VTBL_ENTRY _ZTV7G19x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y0[];
static VTBL_ENTRY alt_thunk_names9[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn32_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y0 = {  "G19x4y0", // class name
  bases_G19x4y0, 6,
  &(vtc_G19x4y0[0]), // expected_vtbl_contents
  &(vtt_G19x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names9,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y1  : virtual E19x4 , F1 {
  int ff;
  ~G19x4y1(); // tgen
  G19x4y1(); // tgen
};
//SIG(1 G19x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x4y1 ::~G19x4y1(){ note_dtor("G19x4y1", this);} // tgen
G19x4y1 ::G19x4y1(){ note_ctor("G19x4y1", this);} // tgen

static void Test_G19x4y1()
{
  extern Class_Descriptor cd_G19x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x4y1, buf);
    G19x4y1 *dp, &lv = *(dp=new (buf) G19x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y1)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(40,32), "G19x4y1");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(24,16), "G19x4y1");
    check_base_class_offset(lv, (C19*)(E19x4*), ABISELECT(16,12), "G19x4y1");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(32,24), "G19x4y1");
    check_base_class_offset(lv, (E19x4*), ABISELECT(16,12), "G19x4y1");
    check_base_class_offset(lv, (F1*), 0, "G19x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x4y1.ff");
    test_class_info(&lv, &cd_G19x4y1);
    dp->~G19x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y1(Test_G19x4y1, "G19x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x4y1C1Ev();
extern void _ZN7G19x4y1D1Ev();
Name_Map name_map_G19x4y1[] = {
  NSPAIR(_ZN7G19x4y1C1Ev),
  NSPAIR(_ZN7G19x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x4y1[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G19x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x4y1[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y1[] = {
  {&(_ZTV7G19x4y1[4]),  4,14},
  {&(_ZTV7G19x4y1[9]),  9,14},
  {&(_ZTV7G19x4y1[13]),  13,14},
  {&(_tg__ZTV5E19x4__7G19x4y1[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x4y1[];
extern  VTBL_ENTRY _ZTV7G19x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y1[];
static VTBL_ENTRY alt_thunk_names10[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y1 = {  "G19x4y1", // class name
  bases_G19x4y1, 6,
  &(vtc_G19x4y1[0]), // expected_vtbl_contents
  &(vtt_G19x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names10,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y2  : E19x4 , virtual F1 {
  int ff;
  ~G19x4y2(); // tgen
  G19x4y2(); // tgen
};
//SIG(1 G19x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x4y2 ::~G19x4y2(){ note_dtor("G19x4y2", this);} // tgen
G19x4y2 ::G19x4y2(){ note_ctor("G19x4y2", this);} // tgen

static void Test_G19x4y2()
{
  extern Class_Descriptor cd_G19x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G19x4y2, buf);
    G19x4y2 *dp, &lv = *(dp=new (buf) G19x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G19x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y2)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(32,24), "G19x4y2");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(8,4), "G19x4y2");
    check_base_class_offset(lv, (C19*)(E19x4*), 0, "G19x4y2");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(16,12), "G19x4y2");
    check_base_class_offset(lv, (E19x4*), 0, "G19x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G19x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G19x4y2.ff");
    test_class_info(&lv, &cd_G19x4y2);
    dp->~G19x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y2(Test_G19x4y2, "G19x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G19x4y2C1Ev();
extern void _ZN7G19x4y2D1Ev();
Name_Map name_map_G19x4y2[] = {
  NSPAIR(_ZN7G19x4y2C1Ev),
  NSPAIR(_ZN7G19x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y2[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y2[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G19x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x4y2[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y2[] = {
  {&(_ZTV7G19x4y2[4]),  4,13},
  {&(_tg__ZTV5E19x4__7G19x4y2[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y2[3]),  3,4},
  {&(_ZTV7G19x4y2[8]),  8,13},
  {&(_ZTV7G19x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G19x4y2[];
extern  VTBL_ENTRY _ZTV7G19x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y2[];
static VTBL_ENTRY alt_thunk_names11[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y2 = {  "G19x4y2", // class name
  bases_G19x4y2, 6,
  &(vtc_G19x4y2[0]), // expected_vtbl_contents
  &(vtt_G19x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G19x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names11,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y3  : virtual E19x4 , virtual F1 {
  int ff;
  ~G19x4y3(); // tgen
  G19x4y3(); // tgen
};
//SIG(1 G19x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x4y3 ::~G19x4y3(){ note_dtor("G19x4y3", this);} // tgen
G19x4y3 ::G19x4y3(){ note_ctor("G19x4y3", this);} // tgen

static void Test_G19x4y3()
{
  extern Class_Descriptor cd_G19x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x4y3, buf);
    G19x4y3 *dp, &lv = *(dp=new (buf) G19x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y3)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(40,28), "G19x4y3");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(24,12), "G19x4y3");
    check_base_class_offset(lv, (C19*)(E19x4*), ABISELECT(16,8), "G19x4y3");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(32,20), "G19x4y3");
    check_base_class_offset(lv, (E19x4*), ABISELECT(16,8), "G19x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G19x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x4y3.ff");
    test_class_info(&lv, &cd_G19x4y3);
    dp->~G19x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y3(Test_G19x4y3, "G19x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G19x4y3C1Ev();
extern void _ZN7G19x4y3D1Ev();
Name_Map name_map_G19x4y3[] = {
  NSPAIR(_ZN7G19x4y3C1Ev),
  NSPAIR(_ZN7G19x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y3[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x4y3[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G19x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x4y3[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y3[] = {
  {&(_ZTV7G19x4y3[5]),  5,18},
  {&(_ZTV7G19x4y3[9]),  9,18},
  {&(_ZTV7G19x4y3[13]),  13,18},
  {&(_ZTV7G19x4y3[17]),  17,18},
  {&(_tg__ZTV5E19x4__7G19x4y3[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x4y3[];
extern  VTBL_ENTRY _ZTV7G19x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y3[];
static VTBL_ENTRY alt_thunk_names12[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y3 = {  "G19x4y3", // class name
  bases_G19x4y3, 6,
  &(vtc_G19x4y3[0]), // expected_vtbl_contents
  &(vtt_G19x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G19x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names12,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y4  : E19x4 , F0 {
  int ff;
  ~G19x4y4(); // tgen
  G19x4y4(); // tgen
};
//SIG(1 G19x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G19x4y4 ::~G19x4y4(){ note_dtor("G19x4y4", this);} // tgen
G19x4y4 ::G19x4y4(){ note_ctor("G19x4y4", this);} // tgen

static void Test_G19x4y4()
{
  extern Class_Descriptor cd_G19x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x4y4, buf);
    G19x4y4 *dp, &lv = *(dp=new (buf) G19x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y4)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(32,28), "G19x4y4");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(8,4), "G19x4y4");
    check_base_class_offset(lv, (C19*)(E19x4*), 0, "G19x4y4");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(16,12), "G19x4y4");
    check_base_class_offset(lv, (E19x4*), 0, "G19x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G19x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G19x4y4.ff");
    test_class_info(&lv, &cd_G19x4y4);
    dp->~G19x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y4(Test_G19x4y4, "G19x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G19x4y4C1Ev();
extern void _ZN7G19x4y4D1Ev();
Name_Map name_map_G19x4y4[] = {
  NSPAIR(_ZN7G19x4y4C1Ev),
  NSPAIR(_ZN7G19x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y4[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G19x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x4y4[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y4[] = {
  {&(_ZTV7G19x4y4[3]),  3,8},
  {&(_tg__ZTV5E19x4__7G19x4y4[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y4[3]),  3,4},
  {&(_ZTV7G19x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G19x4y4[];
extern  VTBL_ENTRY _ZTV7G19x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y4[];
static VTBL_ENTRY alt_thunk_names13[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn28_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y4 = {  "G19x4y4", // class name
  bases_G19x4y4, 6,
  &(vtc_G19x4y4[0]), // expected_vtbl_contents
  &(vtt_G19x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G19x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names13,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y5  : virtual E19x4 , F0 {
  int ff;
  ~G19x4y5(); // tgen
  G19x4y5(); // tgen
};
//SIG(1 G19x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G19x4y5 ::~G19x4y5(){ note_dtor("G19x4y5", this);} // tgen
G19x4y5 ::G19x4y5(){ note_ctor("G19x4y5", this);} // tgen

static void Test_G19x4y5()
{
  extern Class_Descriptor cd_G19x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x4y5, buf);
    G19x4y5 *dp, &lv = *(dp=new (buf) G19x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y5)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(40,32), "G19x4y5");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(24,16), "G19x4y5");
    check_base_class_offset(lv, (C19*)(E19x4*), ABISELECT(16,12), "G19x4y5");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(32,24), "G19x4y5");
    check_base_class_offset(lv, (E19x4*), ABISELECT(16,12), "G19x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x4y5.ff");
    test_class_info(&lv, &cd_G19x4y5);
    dp->~G19x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y5(Test_G19x4y5, "G19x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x4y5C1Ev();
extern void _ZN7G19x4y5D1Ev();
Name_Map name_map_G19x4y5[] = {
  NSPAIR(_ZN7G19x4y5C1Ev),
  NSPAIR(_ZN7G19x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y5[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x4y5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G19x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x4y5[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y5[] = {
  {&(_ZTV7G19x4y5[4]),  4,13},
  {&(_ZTV7G19x4y5[8]),  8,13},
  {&(_ZTV7G19x4y5[12]),  12,13},
  {&(_tg__ZTV5E19x4__7G19x4y5[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x4y5[];
extern  VTBL_ENTRY _ZTV7G19x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y5[];
static VTBL_ENTRY alt_thunk_names14[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y5 = {  "G19x4y5", // class name
  bases_G19x4y5, 6,
  &(vtc_G19x4y5[0]), // expected_vtbl_contents
  &(vtt_G19x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names14,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y6  : E19x4 , virtual F0 {
  int ff;
  ~G19x4y6(); // tgen
  G19x4y6(); // tgen
};
//SIG(1 G19x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x4y6 ::~G19x4y6(){ note_dtor("G19x4y6", this);} // tgen
G19x4y6 ::G19x4y6(){ note_ctor("G19x4y6", this);} // tgen

static void Test_G19x4y6()
{
  extern Class_Descriptor cd_G19x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x4y6, buf);
    G19x4y6 *dp, &lv = *(dp=new (buf) G19x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y6)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(32,24), "G19x4y6");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(8,4), "G19x4y6");
    check_base_class_offset(lv, (C19*)(E19x4*), 0, "G19x4y6");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(16,12), "G19x4y6");
    check_base_class_offset(lv, (E19x4*), 0, "G19x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G19x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G19x4y6.ff");
    test_class_info(&lv, &cd_G19x4y6);
    dp->~G19x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y6(Test_G19x4y6, "G19x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G19x4y6C1Ev();
extern void _ZN7G19x4y6D1Ev();
Name_Map name_map_G19x4y6[] = {
  NSPAIR(_ZN7G19x4y6C1Ev),
  NSPAIR(_ZN7G19x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y6[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x4y6[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y6[] = {
  {&(_ZTV7G19x4y6[4]),  4,9},
  {&(_tg__ZTV5E19x4__7G19x4y6[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y6[3]),  3,4},
  {&(_ZTV7G19x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G19x4y6[];
extern  VTBL_ENTRY _ZTV7G19x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y6[];
static VTBL_ENTRY alt_thunk_names15[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y6 = {  "G19x4y6", // class name
  bases_G19x4y6, 6,
  &(vtc_G19x4y6[0]), // expected_vtbl_contents
  &(vtt_G19x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G19x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names15,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x4y7  : virtual E19x4 , virtual F0 {
  int ff;
  ~G19x4y7(); // tgen
  G19x4y7(); // tgen
};
//SIG(1 G19x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x4y7 ::~G19x4y7(){ note_dtor("G19x4y7", this);} // tgen
G19x4y7 ::G19x4y7(){ note_ctor("G19x4y7", this);} // tgen

static void Test_G19x4y7()
{
  extern Class_Descriptor cd_G19x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x4y7, buf);
    G19x4y7 *dp, &lv = *(dp=new (buf) G19x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x4y7)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x4*), ABISELECT(40,28), "G19x4y7");
    check_base_class_offset(lv, (B0*)(C19*)(E19x4*), ABISELECT(24,12), "G19x4y7");
    check_base_class_offset(lv, (C19*)(E19x4*), ABISELECT(16,8), "G19x4y7");
    check_base_class_offset(lv, (D0*)(E19x4*), ABISELECT(32,20), "G19x4y7");
    check_base_class_offset(lv, (E19x4*), ABISELECT(16,8), "G19x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G19x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x4y7.ff");
    test_class_info(&lv, &cd_G19x4y7);
    dp->~G19x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x4y7(Test_G19x4y7, "G19x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x4y7C1Ev();
extern void _ZN7G19x4y7D1Ev();
Name_Map name_map_G19x4y7[] = {
  NSPAIR(_ZN7G19x4y7C1Ev),
  NSPAIR(_ZN7G19x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x4;
extern VTBL_ENTRY _ZTI5E19x4[];
extern  VTBL_ENTRY _ZTV5E19x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x4y7[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x4y7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x4y7[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x4__7G19x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x4__7G19x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x4__7G19x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x4__7G19x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x4y7[] = {
  {&(_ZTV7G19x4y7[5]),  5,14},
  {&(_ZTV7G19x4y7[9]),  9,14},
  {&(_ZTV7G19x4y7[13]),  13,14},
  {&(_tg__ZTV5E19x4__7G19x4y7[3]),  3,4},
  {&(_tg__ZTV3C195E19x4__7G19x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x4__7G19x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x4__7G19x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x4y7[];
extern  VTBL_ENTRY _ZTV7G19x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x4y7[];
static VTBL_ENTRY alt_thunk_names16[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x4y7 = {  "G19x4y7", // class name
  bases_G19x4y7, 6,
  &(vtc_G19x4y7[0]), // expected_vtbl_contents
  &(vtt_G19x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x4y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names16,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x4  : C20 , D0 {
  int fd;
  ~E20x4(); // tgen
  E20x4(); // tgen
};
//SIG(-1 E20x4) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E20x4 ::~E20x4(){ note_dtor("E20x4", this);} // tgen
E20x4 ::E20x4(){ note_ctor("E20x4", this);} // tgen

static void Test_E20x4()
{
  extern Class_Descriptor cd_E20x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E20x4, buf);
    E20x4 *dp, &lv = *(dp=new (buf) E20x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E20x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x4)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(12,8), "E20x4");
    check_base_class_offset(lv, (B1*)(C20*), 0, "E20x4");
    check_base_class_offset(lv, (C20*), 0, "E20x4");
    check_base_class_offset(lv, (D0*), ABISELECT(20,16), "E20x4");
    check_field_offset(lv, fd, ABISELECT(24,20), "E20x4.fd");
    test_class_info(&lv, &cd_E20x4);
    dp->~E20x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x4(Test_E20x4, "E20x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E20x4C1Ev();
extern void _ZN5E20x4D1Ev();
Name_Map name_map_E20x4[] = {
  NSPAIR(_ZN5E20x4C1Ev),
  NSPAIR(_ZN5E20x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E20x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E20x4[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_E20x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E20x4[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
Class_Descriptor cd_E20x4 = {  "E20x4", // class name
  bases_E20x4, 4,
  &(vtc_E20x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E20x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E20x4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  2, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y0  : E20x4 , F1 {
  int ff;
  ~G20x4y0(); // tgen
  G20x4y0(); // tgen
};
//SIG(1 G20x4y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x4y0 ::~G20x4y0(){ note_dtor("G20x4y0", this);} // tgen
G20x4y0 ::G20x4y0(){ note_ctor("G20x4y0", this);} // tgen

static void Test_G20x4y0()
{
  extern Class_Descriptor cd_G20x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x4y0, buf);
    G20x4y0 *dp, &lv = *(dp=new (buf) G20x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y0)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(12,8), "G20x4y0");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), 0, "G20x4y0");
    check_base_class_offset(lv, (C20*)(E20x4*), 0, "G20x4y0");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(20,16), "G20x4y0");
    check_base_class_offset(lv, (E20x4*), 0, "G20x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(32,24), "G20x4y0");
    check_field_offset(lv, ff, ABISELECT(44,32), "G20x4y0.ff");
    test_class_info(&lv, &cd_G20x4y0);
    dp->~G20x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y0(Test_G20x4y0, "G20x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x4y0C1Ev();
extern void _ZN7G20x4y0D1Ev();
Name_Map name_map_G20x4y0[] = {
  NSPAIR(_ZN7G20x4y0C1Ev),
  NSPAIR(_ZN7G20x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,24), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y0[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y0[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G20x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G20x4y0[];
extern  VTBL_ENTRY _ZTV7G20x4y0[];
Class_Descriptor cd_G20x4y0 = {  "G20x4y0", // class name
  bases_G20x4y0, 6,
  &(vtc_G20x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y0),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y1  : virtual E20x4 , F1 {
  int ff;
  ~G20x4y1(); // tgen
  G20x4y1(); // tgen
};
//SIG(1 G20x4y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x4y1 ::~G20x4y1(){ note_dtor("G20x4y1", this);} // tgen
G20x4y1 ::G20x4y1(){ note_ctor("G20x4y1", this);} // tgen

static void Test_G20x4y1()
{
  extern Class_Descriptor cd_G20x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x4y1, buf);
    G20x4y1 *dp, &lv = *(dp=new (buf) G20x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y1)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(28,20), "G20x4y1");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), ABISELECT(16,12), "G20x4y1");
    check_base_class_offset(lv, (C20*)(E20x4*), ABISELECT(16,12), "G20x4y1");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(36,28), "G20x4y1");
    check_base_class_offset(lv, (E20x4*), ABISELECT(16,12), "G20x4y1");
    check_base_class_offset(lv, (F1*), 0, "G20x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x4y1.ff");
    test_class_info(&lv, &cd_G20x4y1);
    dp->~G20x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y1(Test_G20x4y1, "G20x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x4y1C1Ev();
extern void _ZN7G20x4y1D1Ev();
Name_Map name_map_G20x4y1[] = {
  NSPAIR(_ZN7G20x4y1C1Ev),
  NSPAIR(_ZN7G20x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x4y1[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x4y1[];
static  VTT_ENTRY vtt_G20x4y1[] = {
  {&(_ZTV7G20x4y1[3]),  3,8},
  {&(_ZTV7G20x4y1[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G20x4y1[];
extern  VTBL_ENTRY _ZTV7G20x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x4y1[];
Class_Descriptor cd_G20x4y1 = {  "G20x4y1", // class name
  bases_G20x4y1, 6,
  &(vtc_G20x4y1[0]), // expected_vtbl_contents
  &(vtt_G20x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y1),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x4y1),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y2  : E20x4 , virtual F1 {
  int ff;
  ~G20x4y2(); // tgen
  G20x4y2(); // tgen
};
//SIG(1 G20x4y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x4y2 ::~G20x4y2(){ note_dtor("G20x4y2", this);} // tgen
G20x4y2 ::G20x4y2(){ note_ctor("G20x4y2", this);} // tgen

static void Test_G20x4y2()
{
  extern Class_Descriptor cd_G20x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x4y2, buf);
    G20x4y2 *dp, &lv = *(dp=new (buf) G20x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y2)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(12,8), "G20x4y2");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), 0, "G20x4y2");
    check_base_class_offset(lv, (C20*)(E20x4*), 0, "G20x4y2");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(20,16), "G20x4y2");
    check_base_class_offset(lv, (E20x4*), 0, "G20x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G20x4y2");
    check_field_offset(lv, ff, ABISELECT(28,24), "G20x4y2.ff");
    test_class_info(&lv, &cd_G20x4y2);
    dp->~G20x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y2(Test_G20x4y2, "G20x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x4y2C1Ev();
extern void _ZN7G20x4y2D1Ev();
Name_Map name_map_G20x4y2[] = {
  NSPAIR(_ZN7G20x4y2C1Ev),
  NSPAIR(_ZN7G20x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y2[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x4y2[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y2[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G20x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x4y2[];
static  VTT_ENTRY vtt_G20x4y2[] = {
  {&(_ZTV7G20x4y2[3]),  3,8},
  {&(_ZTV7G20x4y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G20x4y2[];
extern  VTBL_ENTRY _ZTV7G20x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x4y2[];
Class_Descriptor cd_G20x4y2 = {  "G20x4y2", // class name
  bases_G20x4y2, 6,
  &(vtc_G20x4y2[0]), // expected_vtbl_contents
  &(vtt_G20x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y2),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x4y2),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y3  : virtual E20x4 , virtual F1 {
  int ff;
  ~G20x4y3(); // tgen
  G20x4y3(); // tgen
};
//SIG(1 G20x4y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x4y3 ::~G20x4y3(){ note_dtor("G20x4y3", this);} // tgen
G20x4y3 ::G20x4y3(){ note_ctor("G20x4y3", this);} // tgen

static void Test_G20x4y3()
{
  extern Class_Descriptor cd_G20x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x4y3, buf);
    G20x4y3 *dp, &lv = *(dp=new (buf) G20x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y3)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(28,16), "G20x4y3");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), ABISELECT(16,8), "G20x4y3");
    check_base_class_offset(lv, (C20*)(E20x4*), ABISELECT(16,8), "G20x4y3");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(36,24), "G20x4y3");
    check_base_class_offset(lv, (E20x4*), ABISELECT(16,8), "G20x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G20x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x4y3.ff");
    test_class_info(&lv, &cd_G20x4y3);
    dp->~G20x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y3(Test_G20x4y3, "G20x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G20x4y3C1Ev();
extern void _ZN7G20x4y3D1Ev();
Name_Map name_map_G20x4y3[] = {
  NSPAIR(_ZN7G20x4y3C1Ev),
  NSPAIR(_ZN7G20x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y3[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x4y3[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G20x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x4y3[];
static  VTT_ENTRY vtt_G20x4y3[] = {
  {&(_ZTV7G20x4y3[4]),  4,12},
  {&(_ZTV7G20x4y3[7]),  7,12},
  {&(_ZTV7G20x4y3[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G20x4y3[];
extern  VTBL_ENTRY _ZTV7G20x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x4y3[];
Class_Descriptor cd_G20x4y3 = {  "G20x4y3", // class name
  bases_G20x4y3, 6,
  &(vtc_G20x4y3[0]), // expected_vtbl_contents
  &(vtt_G20x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G20x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y3),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x4y3),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y4  : E20x4 , F0 {
  int ff;
  ~G20x4y4(); // tgen
  G20x4y4(); // tgen
};
//SIG(1 G20x4y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G20x4y4 ::~G20x4y4(){ note_dtor("G20x4y4", this);} // tgen
G20x4y4 ::G20x4y4(){ note_ctor("G20x4y4", this);} // tgen

static void Test_G20x4y4()
{
  extern Class_Descriptor cd_G20x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x4y4, buf);
    G20x4y4 *dp, &lv = *(dp=new (buf) G20x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y4)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(12,8), "G20x4y4");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), 0, "G20x4y4");
    check_base_class_offset(lv, (C20*)(E20x4*), 0, "G20x4y4");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(20,16), "G20x4y4");
    check_base_class_offset(lv, (E20x4*), 0, "G20x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(28,24), "G20x4y4");
    check_field_offset(lv, ff, ABISELECT(32,28), "G20x4y4.ff");
    test_class_info(&lv, &cd_G20x4y4);
    dp->~G20x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y4(Test_G20x4y4, "G20x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G20x4y4C1Ev();
extern void _ZN7G20x4y4D1Ev();
Name_Map name_map_G20x4y4[] = {
  NSPAIR(_ZN7G20x4y4C1Ev),
  NSPAIR(_ZN7G20x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y4[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y4[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTI7G20x4y4[];
extern  VTBL_ENTRY _ZTV7G20x4y4[];
Class_Descriptor cd_G20x4y4 = {  "G20x4y4", // class name
  bases_G20x4y4, 6,
  &(vtc_G20x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G20x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y4),3, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y5  : virtual E20x4 , F0 {
  int ff;
  ~G20x4y5(); // tgen
  G20x4y5(); // tgen
};
//SIG(1 G20x4y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G20x4y5 ::~G20x4y5(){ note_dtor("G20x4y5", this);} // tgen
G20x4y5 ::G20x4y5(){ note_ctor("G20x4y5", this);} // tgen

static void Test_G20x4y5()
{
  extern Class_Descriptor cd_G20x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x4y5, buf);
    G20x4y5 *dp, &lv = *(dp=new (buf) G20x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y5)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(28,20), "G20x4y5");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), ABISELECT(16,12), "G20x4y5");
    check_base_class_offset(lv, (C20*)(E20x4*), ABISELECT(16,12), "G20x4y5");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(36,28), "G20x4y5");
    check_base_class_offset(lv, (E20x4*), ABISELECT(16,12), "G20x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x4y5.ff");
    test_class_info(&lv, &cd_G20x4y5);
    dp->~G20x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y5(Test_G20x4y5, "G20x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x4y5C1Ev();
extern void _ZN7G20x4y5D1Ev();
Name_Map name_map_G20x4y5[] = {
  NSPAIR(_ZN7G20x4y5C1Ev),
  NSPAIR(_ZN7G20x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y5[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x4y5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x4y5[];
static  VTT_ENTRY vtt_G20x4y5[] = {
  {&(_ZTV7G20x4y5[3]),  3,7},
  {&(_ZTV7G20x4y5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G20x4y5[];
extern  VTBL_ENTRY _ZTV7G20x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x4y5[];
Class_Descriptor cd_G20x4y5 = {  "G20x4y5", // class name
  bases_G20x4y5, 6,
  &(vtc_G20x4y5[0]), // expected_vtbl_contents
  &(vtt_G20x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x4y5),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y6  : E20x4 , virtual F0 {
  int ff;
  ~G20x4y6(); // tgen
  G20x4y6(); // tgen
};
//SIG(1 G20x4y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x4y6 ::~G20x4y6(){ note_dtor("G20x4y6", this);} // tgen
G20x4y6 ::G20x4y6(){ note_ctor("G20x4y6", this);} // tgen

static void Test_G20x4y6()
{
  extern Class_Descriptor cd_G20x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x4y6, buf);
    G20x4y6 *dp, &lv = *(dp=new (buf) G20x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y6)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(12,8), "G20x4y6");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), 0, "G20x4y6");
    check_base_class_offset(lv, (C20*)(E20x4*), 0, "G20x4y6");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(20,16), "G20x4y6");
    check_base_class_offset(lv, (E20x4*), 0, "G20x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G20x4y6");
    check_field_offset(lv, ff, ABISELECT(28,24), "G20x4y6.ff");
    test_class_info(&lv, &cd_G20x4y6);
    dp->~G20x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y6(Test_G20x4y6, "G20x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G20x4y6C1Ev();
extern void _ZN7G20x4y6D1Ev();
Name_Map name_map_G20x4y6[] = {
  NSPAIR(_ZN7G20x4y6C1Ev),
  NSPAIR(_ZN7G20x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y6[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x4y6[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x4y6[];
static  VTT_ENTRY vtt_G20x4y6[] = {
  {&(_ZTV7G20x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x4y6[];
extern  VTBL_ENTRY _ZTV7G20x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x4y6[];
Class_Descriptor cd_G20x4y6 = {  "G20x4y6", // class name
  bases_G20x4y6, 6,
  &(vtc_G20x4y6[0]), // expected_vtbl_contents
  &(vtt_G20x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G20x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x4y6),1, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x4y7  : virtual E20x4 , virtual F0 {
  int ff;
  ~G20x4y7(); // tgen
  G20x4y7(); // tgen
};
//SIG(1 G20x4y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x4y7 ::~G20x4y7(){ note_dtor("G20x4y7", this);} // tgen
G20x4y7 ::G20x4y7(){ note_ctor("G20x4y7", this);} // tgen

static void Test_G20x4y7()
{
  extern Class_Descriptor cd_G20x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x4y7, buf);
    G20x4y7 *dp, &lv = *(dp=new (buf) G20x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x4y7)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x4*), ABISELECT(28,16), "G20x4y7");
    check_base_class_offset(lv, (B1*)(C20*)(E20x4*), ABISELECT(16,8), "G20x4y7");
    check_base_class_offset(lv, (C20*)(E20x4*), ABISELECT(16,8), "G20x4y7");
    check_base_class_offset(lv, (D0*)(E20x4*), ABISELECT(36,24), "G20x4y7");
    check_base_class_offset(lv, (E20x4*), ABISELECT(16,8), "G20x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G20x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x4y7.ff");
    test_class_info(&lv, &cd_G20x4y7);
    dp->~G20x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x4y7(Test_G20x4y7, "G20x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x4y7C1Ev();
extern void _ZN7G20x4y7D1Ev();
Name_Map name_map_G20x4y7[] = {
  NSPAIR(_ZN7G20x4y7C1Ev),
  NSPAIR(_ZN7G20x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x4;
extern VTBL_ENTRY _ZTI5E20x4[];
extern  VTBL_ENTRY _ZTV5E20x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x4y7[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x4y7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x4y7[];
static  VTT_ENTRY vtt_G20x4y7[] = {
  {&(_ZTV7G20x4y7[4]),  4,8},
  {&(_ZTV7G20x4y7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G20x4y7[];
extern  VTBL_ENTRY _ZTV7G20x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x4y7[];
Class_Descriptor cd_G20x4y7 = {  "G20x4y7", // class name
  bases_G20x4y7, 6,
  &(vtc_G20x4y7[0]), // expected_vtbl_contents
  &(vtt_G20x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x4y7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x4y7),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E21x4  : C21 , D0 {
  int fd;
  ~E21x4(); // tgen
  E21x4(); // tgen
};
//SIG(-1 E21x4) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E21x4 ::~E21x4(){ note_dtor("E21x4", this);} // tgen
E21x4 ::E21x4(){ note_ctor("E21x4", this);} // tgen

static void Test_E21x4()
{
  extern Class_Descriptor cd_E21x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E21x4, buf);
    E21x4 *dp, &lv = *(dp=new (buf) E21x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E21x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x4)");
    check_base_class_offset(lv, (A1*)(C21*), 0, "E21x4");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(16,8), "E21x4");
    check_base_class_offset(lv, (C21*), 0, "E21x4");
    check_base_class_offset(lv, (D0*), ABISELECT(32,20), "E21x4");
    check_field_offset(lv, fd, ABISELECT(36,24), "E21x4.fd");
    test_class_info(&lv, &cd_E21x4);
    dp->~E21x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x4(Test_E21x4, "E21x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E21x4C1Ev();
extern void _ZN5E21x4D1Ev();
Name_Map name_map_E21x4[] = {
  NSPAIR(_ZN5E21x4C1Ev),
  NSPAIR(_ZN5E21x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E21x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E21x4[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_E21x4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI5E21x4[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
Class_Descriptor cd_E21x4 = {  "E21x4", // class name
  bases_E21x4, 4,
  &(vtc_E21x4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E21x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E21x4),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  3, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y0  : E21x4 , F1 {
  int ff;
  ~G21x4y0(); // tgen
  G21x4y0(); // tgen
};
//SIG(1 G21x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x4y0 ::~G21x4y0(){ note_dtor("G21x4y0", this);} // tgen
G21x4y0 ::G21x4y0(){ note_ctor("G21x4y0", this);} // tgen

static void Test_G21x4y0()
{
  extern Class_Descriptor cd_G21x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x4y0, buf);
    G21x4y0 *dp, &lv = *(dp=new (buf) G21x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y0)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), 0, "G21x4y0");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(16,8), "G21x4y0");
    check_base_class_offset(lv, (C21*)(E21x4*), 0, "G21x4y0");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(32,20), "G21x4y0");
    check_base_class_offset(lv, (E21x4*), 0, "G21x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,28), "G21x4y0");
    check_field_offset(lv, ff, ABISELECT(52,36), "G21x4y0.ff");
    test_class_info(&lv, &cd_G21x4y0);
    dp->~G21x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y0(Test_G21x4y0, "G21x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x4y0C1Ev();
extern void _ZN7G21x4y0D1Ev();
Name_Map name_map_G21x4y0[] = {
  NSPAIR(_ZN7G21x4y0C1Ev),
  NSPAIR(_ZN7G21x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y0[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x4y0[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y0[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G21x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTI7G21x4y0[];
extern  VTBL_ENTRY _ZTV7G21x4y0[];
Class_Descriptor cd_G21x4y0 = {  "G21x4y0", // class name
  bases_G21x4y0, 6,
  &(vtc_G21x4y0[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y0),9, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  5, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y1  : virtual E21x4 , F1 {
  int ff;
  ~G21x4y1(); // tgen
  G21x4y1(); // tgen
};
//SIG(1 G21x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x4y1 ::~G21x4y1(){ note_dtor("G21x4y1", this);} // tgen
G21x4y1 ::G21x4y1(){ note_ctor("G21x4y1", this);} // tgen

static void Test_G21x4y1()
{
  extern Class_Descriptor cd_G21x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x4y1, buf);
    G21x4y1 *dp, &lv = *(dp=new (buf) G21x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y1)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), ABISELECT(16,12), "G21x4y1");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(32,20), "G21x4y1");
    check_base_class_offset(lv, (C21*)(E21x4*), ABISELECT(16,12), "G21x4y1");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(48,32), "G21x4y1");
    check_base_class_offset(lv, (E21x4*), ABISELECT(16,12), "G21x4y1");
    check_base_class_offset(lv, (F1*), 0, "G21x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x4y1.ff");
    test_class_info(&lv, &cd_G21x4y1);
    dp->~G21x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y1(Test_G21x4y1, "G21x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x4y1C1Ev();
extern void _ZN7G21x4y1D1Ev();
Name_Map name_map_G21x4y1[] = {
  NSPAIR(_ZN7G21x4y1C1Ev),
  NSPAIR(_ZN7G21x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x4y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x4y1[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x4y1[];
static  VTT_ENTRY vtt_G21x4y1[] = {
  {&(_ZTV7G21x4y1[3]),  3,11},
  {&(_ZTV7G21x4y1[7]),  7,11},
  {&(_ZTV7G21x4y1[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G21x4y1[];
extern  VTBL_ENTRY _ZTV7G21x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x4y1[];
Class_Descriptor cd_G21x4y1 = {  "G21x4y1", // class name
  bases_G21x4y1, 6,
  &(vtc_G21x4y1[0]), // expected_vtbl_contents
  &(vtt_G21x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y1),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x4y1),3, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y2  : E21x4 , virtual F1 {
  int ff;
  ~G21x4y2(); // tgen
  G21x4y2(); // tgen
};
//SIG(1 G21x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x4y2 ::~G21x4y2(){ note_dtor("G21x4y2", this);} // tgen
G21x4y2 ::G21x4y2(){ note_ctor("G21x4y2", this);} // tgen

static void Test_G21x4y2()
{
  extern Class_Descriptor cd_G21x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x4y2, buf);
    G21x4y2 *dp, &lv = *(dp=new (buf) G21x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y2)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), 0, "G21x4y2");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(16,8), "G21x4y2");
    check_base_class_offset(lv, (C21*)(E21x4*), 0, "G21x4y2");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(32,20), "G21x4y2");
    check_base_class_offset(lv, (E21x4*), 0, "G21x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G21x4y2");
    check_field_offset(lv, ff, ABISELECT(40,28), "G21x4y2.ff");
    test_class_info(&lv, &cd_G21x4y2);
    dp->~G21x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y2(Test_G21x4y2, "G21x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x4y2C1Ev();
extern void _ZN7G21x4y2D1Ev();
Name_Map name_map_G21x4y2[] = {
  NSPAIR(_ZN7G21x4y2C1Ev),
  NSPAIR(_ZN7G21x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y2[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x4y2[] = {
  ABISELECT(48,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y2[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G21x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x4y2[];
static  VTT_ENTRY vtt_G21x4y2[] = {
  {&(_ZTV7G21x4y2[3]),  3,11},
  {&(_ZTV7G21x4y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G21x4y2[];
extern  VTBL_ENTRY _ZTV7G21x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x4y2[];
Class_Descriptor cd_G21x4y2 = {  "G21x4y2", // class name
  bases_G21x4y2, 6,
  &(vtc_G21x4y2[0]), // expected_vtbl_contents
  &(vtt_G21x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y2),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x4y2),2, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y3  : virtual E21x4 , virtual F1 {
  int ff;
  ~G21x4y3(); // tgen
  G21x4y3(); // tgen
};
//SIG(1 G21x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x4y3 ::~G21x4y3(){ note_dtor("G21x4y3", this);} // tgen
G21x4y3 ::G21x4y3(){ note_ctor("G21x4y3", this);} // tgen

static void Test_G21x4y3()
{
  extern Class_Descriptor cd_G21x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x4y3, buf);
    G21x4y3 *dp, &lv = *(dp=new (buf) G21x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y3)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), ABISELECT(16,8), "G21x4y3");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(32,16), "G21x4y3");
    check_base_class_offset(lv, (C21*)(E21x4*), ABISELECT(16,8), "G21x4y3");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(48,28), "G21x4y3");
    check_base_class_offset(lv, (E21x4*), ABISELECT(16,8), "G21x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x4y3.ff");
    test_class_info(&lv, &cd_G21x4y3);
    dp->~G21x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y3(Test_G21x4y3, "G21x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x4y3C1Ev();
extern void _ZN7G21x4y3D1Ev();
Name_Map name_map_G21x4y3[] = {
  NSPAIR(_ZN7G21x4y3C1Ev),
  NSPAIR(_ZN7G21x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y3[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y3[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x4y3[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G21x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G21x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x4y3[];
static  VTT_ENTRY vtt_G21x4y3[] = {
  {&(_ZTV7G21x4y3[4]),  4,15},
  {&(_ZTV7G21x4y3[7]),  7,15},
  {&(_ZTV7G21x4y3[10]),  10,15},
  {&(_ZTV7G21x4y3[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G21x4y3[];
extern  VTBL_ENTRY _ZTV7G21x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x4y3[];
Class_Descriptor cd_G21x4y3 = {  "G21x4y3", // class name
  bases_G21x4y3, 6,
  &(vtc_G21x4y3[0]), // expected_vtbl_contents
  &(vtt_G21x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y3),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x4y3),4, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y4  : E21x4 , F0 {
  int ff;
  ~G21x4y4(); // tgen
  G21x4y4(); // tgen
};
//SIG(1 G21x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G21x4y4 ::~G21x4y4(){ note_dtor("G21x4y4", this);} // tgen
G21x4y4 ::G21x4y4(){ note_ctor("G21x4y4", this);} // tgen

static void Test_G21x4y4()
{
  extern Class_Descriptor cd_G21x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x4y4, buf);
    G21x4y4 *dp, &lv = *(dp=new (buf) G21x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y4)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), 0, "G21x4y4");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(16,8), "G21x4y4");
    check_base_class_offset(lv, (C21*)(E21x4*), 0, "G21x4y4");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(32,20), "G21x4y4");
    check_base_class_offset(lv, (E21x4*), 0, "G21x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(40,28), "G21x4y4");
    check_field_offset(lv, ff, ABISELECT(44,32), "G21x4y4.ff");
    test_class_info(&lv, &cd_G21x4y4);
    dp->~G21x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y4(Test_G21x4y4, "G21x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G21x4y4C1Ev();
extern void _ZN7G21x4y4D1Ev();
Name_Map name_map_G21x4y4[] = {
  NSPAIR(_ZN7G21x4y4C1Ev),
  NSPAIR(_ZN7G21x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    0, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y4[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x4y4[] = {
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y4[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTI7G21x4y4[];
extern  VTBL_ENTRY _ZTV7G21x4y4[];
Class_Descriptor cd_G21x4y4 = {  "G21x4y4", // class name
  bases_G21x4y4, 6,
  &(vtc_G21x4y4[0]), // expected_vtbl_contents
  0, //no vtt
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G21x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y4),6, //virtual function table var
  2, // offset into main vftv pointed to by object[0]
  {0,0},0, // virtual table table var
  4, // n_initialized_bases
  0, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y5  : virtual E21x4 , F0 {
  int ff;
  ~G21x4y5(); // tgen
  G21x4y5(); // tgen
};
//SIG(1 G21x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G21x4y5 ::~G21x4y5(){ note_dtor("G21x4y5", this);} // tgen
G21x4y5 ::G21x4y5(){ note_ctor("G21x4y5", this);} // tgen

static void Test_G21x4y5()
{
  extern Class_Descriptor cd_G21x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x4y5, buf);
    G21x4y5 *dp, &lv = *(dp=new (buf) G21x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y5)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), ABISELECT(16,12), "G21x4y5");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(32,20), "G21x4y5");
    check_base_class_offset(lv, (C21*)(E21x4*), ABISELECT(16,12), "G21x4y5");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(48,32), "G21x4y5");
    check_base_class_offset(lv, (E21x4*), ABISELECT(16,12), "G21x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x4y5.ff");
    test_class_info(&lv, &cd_G21x4y5);
    dp->~G21x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y5(Test_G21x4y5, "G21x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x4y5C1Ev();
extern void _ZN7G21x4y5D1Ev();
Name_Map name_map_G21x4y5[] = {
  NSPAIR(_ZN7G21x4y5C1Ev),
  NSPAIR(_ZN7G21x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y5[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x4y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x4y5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x4y5[];
static  VTT_ENTRY vtt_G21x4y5[] = {
  {&(_ZTV7G21x4y5[3]),  3,10},
  {&(_ZTV7G21x4y5[6]),  6,10},
  {&(_ZTV7G21x4y5[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G21x4y5[];
extern  VTBL_ENTRY _ZTV7G21x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x4y5[];
Class_Descriptor cd_G21x4y5 = {  "G21x4y5", // class name
  bases_G21x4y5, 6,
  &(vtc_G21x4y5[0]), // expected_vtbl_contents
  &(vtt_G21x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y5),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x4y5),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y6  : E21x4 , virtual F0 {
  int ff;
  ~G21x4y6(); // tgen
  G21x4y6(); // tgen
};
//SIG(1 G21x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x4y6 ::~G21x4y6(){ note_dtor("G21x4y6", this);} // tgen
G21x4y6 ::G21x4y6(){ note_ctor("G21x4y6", this);} // tgen

static void Test_G21x4y6()
{
  extern Class_Descriptor cd_G21x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x4y6, buf);
    G21x4y6 *dp, &lv = *(dp=new (buf) G21x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y6)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), 0, "G21x4y6");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(16,8), "G21x4y6");
    check_base_class_offset(lv, (C21*)(E21x4*), 0, "G21x4y6");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(32,20), "G21x4y6");
    check_base_class_offset(lv, (E21x4*), 0, "G21x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G21x4y6");
    check_field_offset(lv, ff, ABISELECT(40,28), "G21x4y6.ff");
    test_class_info(&lv, &cd_G21x4y6);
    dp->~G21x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y6(Test_G21x4y6, "G21x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G21x4y6C1Ev();
extern void _ZN7G21x4y6D1Ev();
Name_Map name_map_G21x4y6[] = {
  NSPAIR(_ZN7G21x4y6C1Ev),
  NSPAIR(_ZN7G21x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y6[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x4y6[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x4y6[];
static  VTT_ENTRY vtt_G21x4y6[] = {
  {&(_ZTV7G21x4y6[3]),  3,7},
};
extern VTBL_ENTRY _ZTI7G21x4y6[];
extern  VTBL_ENTRY _ZTV7G21x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x4y6[];
Class_Descriptor cd_G21x4y6 = {  "G21x4y6", // class name
  bases_G21x4y6, 6,
  &(vtc_G21x4y6[0]), // expected_vtbl_contents
  &(vtt_G21x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G21x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y6),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x4y6),1, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x4y7  : virtual E21x4 , virtual F0 {
  int ff;
  ~G21x4y7(); // tgen
  G21x4y7(); // tgen
};
//SIG(1 G21x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x4y7 ::~G21x4y7(){ note_dtor("G21x4y7", this);} // tgen
G21x4y7 ::G21x4y7(){ note_ctor("G21x4y7", this);} // tgen

static void Test_G21x4y7()
{
  extern Class_Descriptor cd_G21x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x4y7, buf);
    G21x4y7 *dp, &lv = *(dp=new (buf) G21x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x4y7)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x4*), ABISELECT(16,8), "G21x4y7");
    check_base_class_offset(lv, (B1*)(C21*)(E21x4*), ABISELECT(32,16), "G21x4y7");
    check_base_class_offset(lv, (C21*)(E21x4*), ABISELECT(16,8), "G21x4y7");
    check_base_class_offset(lv, (D0*)(E21x4*), ABISELECT(48,28), "G21x4y7");
    check_base_class_offset(lv, (E21x4*), ABISELECT(16,8), "G21x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G21x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x4y7.ff");
    test_class_info(&lv, &cd_G21x4y7);
    dp->~G21x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x4y7(Test_G21x4y7, "G21x4y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x4y7C1Ev();
extern void _ZN7G21x4y7D1Ev();
Name_Map name_map_G21x4y7[] = {
  NSPAIR(_ZN7G21x4y7C1Ev),
  NSPAIR(_ZN7G21x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x4;
extern VTBL_ENTRY _ZTI5E21x4[];
extern  VTBL_ENTRY _ZTV5E21x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x4y7[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x4y7[] = {
  ABISELECT(56,36),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x4y7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x4y7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G21x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x4y7[];
static  VTT_ENTRY vtt_G21x4y7[] = {
  {&(_ZTV7G21x4y7[4]),  4,11},
  {&(_ZTV7G21x4y7[7]),  7,11},
  {&(_ZTV7G21x4y7[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G21x4y7[];
extern  VTBL_ENTRY _ZTV7G21x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x4y7[];
Class_Descriptor cd_G21x4y7 = {  "G21x4y7", // class name
  bases_G21x4y7, 6,
  &(vtc_G21x4y7[0]), // expected_vtbl_contents
  &(vtt_G21x4y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x4y7),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x4y7),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E22x4  : C22 , D0 {
  int fd;
  ~E22x4(); // tgen
  E22x4(); // tgen
};
//SIG(-1 E22x4) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E22x4 ::~E22x4(){ note_dtor("E22x4", this);} // tgen
E22x4 ::E22x4(){ note_ctor("E22x4", this);} // tgen

static void Test_E22x4()
{
  extern Class_Descriptor cd_E22x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E22x4, buf);
    E22x4 *dp, &lv = *(dp=new (buf) E22x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E22x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x4)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(24,20), "E22x4");
    check_base_class_offset(lv, (B1*)(C22*), 0, "E22x4");
    check_base_class_offset(lv, (C22*), 0, "E22x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E22x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E22x4.fd");
    test_class_info(&lv, &cd_E22x4);
    dp->~E22x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x4(Test_E22x4, "E22x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E22x4C1Ev();
extern void _ZN5E22x4D1Ev();
Name_Map name_map_E22x4[] = {
  NSPAIR(_ZN5E22x4C1Ev),
  NSPAIR(_ZN5E22x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E22x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E22x4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_E22x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV5E22x4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x4[] = {
  {&(_ZTV5E22x4[3]),  3,4},
  {&(_tg__ZTV3C22__5E22x4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
Class_Descriptor cd_E22x4 = {  "E22x4", // class name
  bases_E22x4, 4,
  &(vtc_E22x4[0]), // expected_vtbl_contents
  &(vtt_E22x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E22x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E22x4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E22x4),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y0  : E22x4 , F1 {
  int ff;
  ~G22x4y0(); // tgen
  G22x4y0(); // tgen
};
//SIG(1 G22x4y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x4y0 ::~G22x4y0(){ note_dtor("G22x4y0", this);} // tgen
G22x4y0 ::G22x4y0(){ note_ctor("G22x4y0", this);} // tgen

static void Test_G22x4y0()
{
  extern Class_Descriptor cd_G22x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x4y0, buf);
    G22x4y0 *dp, &lv = *(dp=new (buf) G22x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y0)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(40,32), "G22x4y0");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), 0, "G22x4y0");
    check_base_class_offset(lv, (C22*)(E22x4*), 0, "G22x4y0");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(16,12), "G22x4y0");
    check_base_class_offset(lv, (E22x4*), 0, "G22x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G22x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G22x4y0.ff");
    test_class_info(&lv, &cd_G22x4y0);
    dp->~G22x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y0(Test_G22x4y0, "G22x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x4y0C1Ev();
extern void _ZN7G22x4y0D1Ev();
Name_Map name_map_G22x4y0[] = {
  NSPAIR(_ZN7G22x4y0C1Ev),
  NSPAIR(_ZN7G22x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y0[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y0[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G22x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y0[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y0[] = {
  {&(_ZTV7G22x4y0[3]),  3,7},
  {&(_tg__ZTV5E22x4__7G22x4y0[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y0[];
extern  VTBL_ENTRY _ZTV7G22x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y0[];
Class_Descriptor cd_G22x4y0 = {  "G22x4y0", // class name
  bases_G22x4y0, 6,
  &(vtc_G22x4y0[0]), // expected_vtbl_contents
  &(vtt_G22x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y1  : virtual E22x4 , F1 {
  int ff;
  ~G22x4y1(); // tgen
  G22x4y1(); // tgen
};
//SIG(1 G22x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x4y1 ::~G22x4y1(){ note_dtor("G22x4y1", this);} // tgen
G22x4y1 ::G22x4y1(){ note_ctor("G22x4y1", this);} // tgen

static void Test_G22x4y1()
{
  extern Class_Descriptor cd_G22x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x4y1, buf);
    G22x4y1 *dp, &lv = *(dp=new (buf) G22x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y1)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(40,32), "G22x4y1");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), ABISELECT(16,12), "G22x4y1");
    check_base_class_offset(lv, (C22*)(E22x4*), ABISELECT(16,12), "G22x4y1");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(32,24), "G22x4y1");
    check_base_class_offset(lv, (E22x4*), ABISELECT(16,12), "G22x4y1");
    check_base_class_offset(lv, (F1*), 0, "G22x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x4y1.ff");
    test_class_info(&lv, &cd_G22x4y1);
    dp->~G22x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y1(Test_G22x4y1, "G22x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x4y1C1Ev();
extern void _ZN7G22x4y1D1Ev();
Name_Map name_map_G22x4y1[] = {
  NSPAIR(_ZN7G22x4y1C1Ev),
  NSPAIR(_ZN7G22x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x4y1[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y1[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y1[] = {
  {&(_ZTV7G22x4y1[4]),  4,10},
  {&(_ZTV7G22x4y1[9]),  9,10},
  {&(_tg__ZTV5E22x4__7G22x4y1[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y1[];
extern  VTBL_ENTRY _ZTV7G22x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y1[];
Class_Descriptor cd_G22x4y1 = {  "G22x4y1", // class name
  bases_G22x4y1, 6,
  &(vtc_G22x4y1[0]), // expected_vtbl_contents
  &(vtt_G22x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y2  : E22x4 , virtual F1 {
  int ff;
  ~G22x4y2(); // tgen
  G22x4y2(); // tgen
};
//SIG(1 G22x4y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x4y2 ::~G22x4y2(){ note_dtor("G22x4y2", this);} // tgen
G22x4y2 ::G22x4y2(){ note_ctor("G22x4y2", this);} // tgen

static void Test_G22x4y2()
{
  extern Class_Descriptor cd_G22x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x4y2, buf);
    G22x4y2 *dp, &lv = *(dp=new (buf) G22x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y2)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(28,24), "G22x4y2");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), 0, "G22x4y2");
    check_base_class_offset(lv, (C22*)(E22x4*), 0, "G22x4y2");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(16,12), "G22x4y2");
    check_base_class_offset(lv, (E22x4*), 0, "G22x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G22x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G22x4y2.ff");
    test_class_info(&lv, &cd_G22x4y2);
    dp->~G22x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y2(Test_G22x4y2, "G22x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x4y2C1Ev();
extern void _ZN7G22x4y2D1Ev();
Name_Map name_map_G22x4y2[] = {
  NSPAIR(_ZN7G22x4y2C1Ev),
  NSPAIR(_ZN7G22x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y2[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y2[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G22x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y2[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y2[] = {
  {&(_ZTV7G22x4y2[4]),  4,9},
  {&(_tg__ZTV5E22x4__7G22x4y2[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y2[3]),  3,4},
  {&(_ZTV7G22x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G22x4y2[];
extern  VTBL_ENTRY _ZTV7G22x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y2[];
Class_Descriptor cd_G22x4y2 = {  "G22x4y2", // class name
  bases_G22x4y2, 6,
  &(vtc_G22x4y2[0]), // expected_vtbl_contents
  &(vtt_G22x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y3  : virtual E22x4 , virtual F1 {
  int ff;
  ~G22x4y3(); // tgen
  G22x4y3(); // tgen
};
//SIG(1 G22x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x4y3 ::~G22x4y3(){ note_dtor("G22x4y3", this);} // tgen
G22x4y3 ::G22x4y3(){ note_ctor("G22x4y3", this);} // tgen

static void Test_G22x4y3()
{
  extern Class_Descriptor cd_G22x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x4y3, buf);
    G22x4y3 *dp, &lv = *(dp=new (buf) G22x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y3)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(40,28), "G22x4y3");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), ABISELECT(16,8), "G22x4y3");
    check_base_class_offset(lv, (C22*)(E22x4*), ABISELECT(16,8), "G22x4y3");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(32,20), "G22x4y3");
    check_base_class_offset(lv, (E22x4*), ABISELECT(16,8), "G22x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G22x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x4y3.ff");
    test_class_info(&lv, &cd_G22x4y3);
    dp->~G22x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y3(Test_G22x4y3, "G22x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G22x4y3C1Ev();
extern void _ZN7G22x4y3D1Ev();
Name_Map name_map_G22x4y3[] = {
  NSPAIR(_ZN7G22x4y3C1Ev),
  NSPAIR(_ZN7G22x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y3[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x4y3[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G22x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y3[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y3[] = {
  {&(_ZTV7G22x4y3[5]),  5,14},
  {&(_ZTV7G22x4y3[9]),  9,14},
  {&(_ZTV7G22x4y3[13]),  13,14},
  {&(_tg__ZTV5E22x4__7G22x4y3[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y3[];
extern  VTBL_ENTRY _ZTV7G22x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y3[];
Class_Descriptor cd_G22x4y3 = {  "G22x4y3", // class name
  bases_G22x4y3, 6,
  &(vtc_G22x4y3[0]), // expected_vtbl_contents
  &(vtt_G22x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G22x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y4  : E22x4 , F0 {
  int ff;
  ~G22x4y4(); // tgen
  G22x4y4(); // tgen
};
//SIG(1 G22x4y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G22x4y4 ::~G22x4y4(){ note_dtor("G22x4y4", this);} // tgen
G22x4y4 ::G22x4y4(){ note_ctor("G22x4y4", this);} // tgen

static void Test_G22x4y4()
{
  extern Class_Descriptor cd_G22x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x4y4, buf);
    G22x4y4 *dp, &lv = *(dp=new (buf) G22x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y4)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(32,28), "G22x4y4");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), 0, "G22x4y4");
    check_base_class_offset(lv, (C22*)(E22x4*), 0, "G22x4y4");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(16,12), "G22x4y4");
    check_base_class_offset(lv, (E22x4*), 0, "G22x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G22x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G22x4y4.ff");
    test_class_info(&lv, &cd_G22x4y4);
    dp->~G22x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y4(Test_G22x4y4, "G22x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G22x4y4C1Ev();
extern void _ZN7G22x4y4D1Ev();
Name_Map name_map_G22x4y4[] = {
  NSPAIR(_ZN7G22x4y4C1Ev),
  NSPAIR(_ZN7G22x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y4[] = {
  {&(_ZTV7G22x4y4[3]),  3,4},
  {&(_tg__ZTV5E22x4__7G22x4y4[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y4[];
extern  VTBL_ENTRY _ZTV7G22x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y4[];
Class_Descriptor cd_G22x4y4 = {  "G22x4y4", // class name
  bases_G22x4y4, 6,
  &(vtc_G22x4y4[0]), // expected_vtbl_contents
  &(vtt_G22x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G22x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y5  : virtual E22x4 , F0 {
  int ff;
  ~G22x4y5(); // tgen
  G22x4y5(); // tgen
};
//SIG(1 G22x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G22x4y5 ::~G22x4y5(){ note_dtor("G22x4y5", this);} // tgen
G22x4y5 ::G22x4y5(){ note_ctor("G22x4y5", this);} // tgen

static void Test_G22x4y5()
{
  extern Class_Descriptor cd_G22x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x4y5, buf);
    G22x4y5 *dp, &lv = *(dp=new (buf) G22x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y5)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(40,32), "G22x4y5");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), ABISELECT(16,12), "G22x4y5");
    check_base_class_offset(lv, (C22*)(E22x4*), ABISELECT(16,12), "G22x4y5");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(32,24), "G22x4y5");
    check_base_class_offset(lv, (E22x4*), ABISELECT(16,12), "G22x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x4y5.ff");
    test_class_info(&lv, &cd_G22x4y5);
    dp->~G22x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y5(Test_G22x4y5, "G22x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x4y5C1Ev();
extern void _ZN7G22x4y5D1Ev();
Name_Map name_map_G22x4y5[] = {
  NSPAIR(_ZN7G22x4y5C1Ev),
  NSPAIR(_ZN7G22x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x4y5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y5[] = {
  {&(_ZTV7G22x4y5[4]),  4,9},
  {&(_ZTV7G22x4y5[8]),  8,9},
  {&(_tg__ZTV5E22x4__7G22x4y5[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y5[];
extern  VTBL_ENTRY _ZTV7G22x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y5[];
Class_Descriptor cd_G22x4y5 = {  "G22x4y5", // class name
  bases_G22x4y5, 6,
  &(vtc_G22x4y5[0]), // expected_vtbl_contents
  &(vtt_G22x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y6  : E22x4 , virtual F0 {
  int ff;
  ~G22x4y6(); // tgen
  G22x4y6(); // tgen
};
//SIG(1 G22x4y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x4y6 ::~G22x4y6(){ note_dtor("G22x4y6", this);} // tgen
G22x4y6 ::G22x4y6(){ note_ctor("G22x4y6", this);} // tgen

static void Test_G22x4y6()
{
  extern Class_Descriptor cd_G22x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x4y6, buf);
    G22x4y6 *dp, &lv = *(dp=new (buf) G22x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y6)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(28,24), "G22x4y6");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), 0, "G22x4y6");
    check_base_class_offset(lv, (C22*)(E22x4*), 0, "G22x4y6");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(16,12), "G22x4y6");
    check_base_class_offset(lv, (E22x4*), 0, "G22x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G22x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G22x4y6.ff");
    test_class_info(&lv, &cd_G22x4y6);
    dp->~G22x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y6(Test_G22x4y6, "G22x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G22x4y6C1Ev();
extern void _ZN7G22x4y6D1Ev();
Name_Map name_map_G22x4y6[] = {
  NSPAIR(_ZN7G22x4y6C1Ev),
  NSPAIR(_ZN7G22x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y6[] = {
  {&(_ZTV7G22x4y6[4]),  4,5},
  {&(_tg__ZTV5E22x4__7G22x4y6[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y6[];
extern  VTBL_ENTRY _ZTV7G22x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y6[];
Class_Descriptor cd_G22x4y6 = {  "G22x4y6", // class name
  bases_G22x4y6, 6,
  &(vtc_G22x4y6[0]), // expected_vtbl_contents
  &(vtt_G22x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G22x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x4y7  : virtual E22x4 , virtual F0 {
  int ff;
  ~G22x4y7(); // tgen
  G22x4y7(); // tgen
};
//SIG(1 G22x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x4y7 ::~G22x4y7(){ note_dtor("G22x4y7", this);} // tgen
G22x4y7 ::G22x4y7(){ note_ctor("G22x4y7", this);} // tgen

static void Test_G22x4y7()
{
  extern Class_Descriptor cd_G22x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x4y7, buf);
    G22x4y7 *dp, &lv = *(dp=new (buf) G22x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x4y7)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x4*), ABISELECT(40,28), "G22x4y7");
    check_base_class_offset(lv, (B1*)(C22*)(E22x4*), ABISELECT(16,8), "G22x4y7");
    check_base_class_offset(lv, (C22*)(E22x4*), ABISELECT(16,8), "G22x4y7");
    check_base_class_offset(lv, (D0*)(E22x4*), ABISELECT(32,20), "G22x4y7");
    check_base_class_offset(lv, (E22x4*), ABISELECT(16,8), "G22x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G22x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x4y7.ff");
    test_class_info(&lv, &cd_G22x4y7);
    dp->~G22x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x4y7(Test_G22x4y7, "G22x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x4y7C1Ev();
extern void _ZN7G22x4y7D1Ev();
Name_Map name_map_G22x4y7[] = {
  NSPAIR(_ZN7G22x4y7C1Ev),
  NSPAIR(_ZN7G22x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x4;
extern VTBL_ENTRY _ZTI5E22x4[];
extern  VTBL_ENTRY _ZTV5E22x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x4y7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x4y7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x4y7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x4__7G22x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x4__7G22x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x4y7[] = {
  {&(_ZTV7G22x4y7[5]),  5,10},
  {&(_ZTV7G22x4y7[9]),  9,10},
  {&(_tg__ZTV5E22x4__7G22x4y7[3]),  3,4},
  {&(_tg__ZTV3C225E22x4__7G22x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x4y7[];
extern  VTBL_ENTRY _ZTV7G22x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x4y7[];
Class_Descriptor cd_G22x4y7 = {  "G22x4y7", // class name
  bases_G22x4y7, 6,
  &(vtc_G22x4y7[0]), // expected_vtbl_contents
  &(vtt_G22x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x4y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x4y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E23x4  : C23 , D0 {
  int fd;
  ~E23x4(); // tgen
  E23x4(); // tgen
};
//SIG(-1 E23x4) C1{ BC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E23x4 ::~E23x4(){ note_dtor("E23x4", this);} // tgen
E23x4 ::E23x4(){ note_ctor("E23x4", this);} // tgen

static void Test_E23x4()
{
  extern Class_Descriptor cd_E23x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E23x4, buf);
    E23x4 *dp, &lv = *(dp=new (buf) E23x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E23x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x4)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(24,20), "E23x4");
    check_base_class_offset(lv, (B1*)(C23*), 0, "E23x4");
    check_base_class_offset(lv, (C23*), 0, "E23x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E23x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E23x4.fd");
    test_class_info(&lv, &cd_E23x4);
    dp->~E23x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x4(Test_E23x4, "E23x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E23x4C1Ev();
extern void _ZN5E23x4D1Ev();
Name_Map name_map_E23x4[] = {
  NSPAIR(_ZN5E23x4C1Ev),
  NSPAIR(_ZN5E23x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E23x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E23x4[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV5E23x4[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__5E23x4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x4[] = {
  {&(_ZTV5E23x4[3]),  3,8},
  {&(_tg__ZTV3C23__5E23x4[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__5E23x4[3]),  3,4},
  {&(_ZTV5E23x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
static VTBL_ENTRY alt_thunk_names17[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x4 = {  "E23x4", // class name
  bases_E23x4, 4,
  &(vtc_E23x4[0]), // expected_vtbl_contents
  &(vtt_E23x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E23x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E23x4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E23x4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names17,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y0  : E23x4 , F1 {
  int ff;
  ~G23x4y0(); // tgen
  G23x4y0(); // tgen
};
//SIG(1 G23x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x4y0 ::~G23x4y0(){ note_dtor("G23x4y0", this);} // tgen
G23x4y0 ::G23x4y0(){ note_ctor("G23x4y0", this);} // tgen

static void Test_G23x4y0()
{
  extern Class_Descriptor cd_G23x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x4y0, buf);
    G23x4y0 *dp, &lv = *(dp=new (buf) G23x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y0)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(40,32), "G23x4y0");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), 0, "G23x4y0");
    check_base_class_offset(lv, (C23*)(E23x4*), 0, "G23x4y0");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(16,12), "G23x4y0");
    check_base_class_offset(lv, (E23x4*), 0, "G23x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G23x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G23x4y0.ff");
    test_class_info(&lv, &cd_G23x4y0);
    dp->~G23x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y0(Test_G23x4y0, "G23x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x4y0C1Ev();
extern void _ZN7G23x4y0D1Ev();
Name_Map name_map_G23x4y0[] = {
  NSPAIR(_ZN7G23x4y0C1Ev),
  NSPAIR(_ZN7G23x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y0[];
extern void _ZN3C233fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y0[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G23x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G23x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x4y0[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y0[] = {
  {&(_ZTV7G23x4y0[3]),  3,11},
  {&(_tg__ZTV5E23x4__7G23x4y0[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y0[3]),  3,4},
  {&(_ZTV7G23x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G23x4y0[];
extern  VTBL_ENTRY _ZTV7G23x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y0[];
static VTBL_ENTRY alt_thunk_names18[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn32_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y0 = {  "G23x4y0", // class name
  bases_G23x4y0, 6,
  &(vtc_G23x4y0[0]), // expected_vtbl_contents
  &(vtt_G23x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names18,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y1  : virtual E23x4 , F1 {
  int ff;
  ~G23x4y1(); // tgen
  G23x4y1(); // tgen
};
//SIG(1 G23x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x4y1 ::~G23x4y1(){ note_dtor("G23x4y1", this);} // tgen
G23x4y1 ::G23x4y1(){ note_ctor("G23x4y1", this);} // tgen

static void Test_G23x4y1()
{
  extern Class_Descriptor cd_G23x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x4y1, buf);
    G23x4y1 *dp, &lv = *(dp=new (buf) G23x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y1)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(40,32), "G23x4y1");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), ABISELECT(16,12), "G23x4y1");
    check_base_class_offset(lv, (C23*)(E23x4*), ABISELECT(16,12), "G23x4y1");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(32,24), "G23x4y1");
    check_base_class_offset(lv, (E23x4*), ABISELECT(16,12), "G23x4y1");
    check_base_class_offset(lv, (F1*), 0, "G23x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x4y1.ff");
    test_class_info(&lv, &cd_G23x4y1);
    dp->~G23x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y1(Test_G23x4y1, "G23x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x4y1C1Ev();
extern void _ZN7G23x4y1D1Ev();
Name_Map name_map_G23x4y1[] = {
  NSPAIR(_ZN7G23x4y1C1Ev),
  NSPAIR(_ZN7G23x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x4y1[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G23x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x4y1[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y1[] = {
  {&(_ZTV7G23x4y1[4]),  4,14},
  {&(_ZTV7G23x4y1[9]),  9,14},
  {&(_ZTV7G23x4y1[13]),  13,14},
  {&(_tg__ZTV5E23x4__7G23x4y1[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x4y1[];
extern  VTBL_ENTRY _ZTV7G23x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y1[];
static VTBL_ENTRY alt_thunk_names19[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y1 = {  "G23x4y1", // class name
  bases_G23x4y1, 6,
  &(vtc_G23x4y1[0]), // expected_vtbl_contents
  &(vtt_G23x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names19,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y2  : E23x4 , virtual F1 {
  int ff;
  ~G23x4y2(); // tgen
  G23x4y2(); // tgen
};
//SIG(1 G23x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x4y2 ::~G23x4y2(){ note_dtor("G23x4y2", this);} // tgen
G23x4y2 ::G23x4y2(){ note_ctor("G23x4y2", this);} // tgen

static void Test_G23x4y2()
{
  extern Class_Descriptor cd_G23x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G23x4y2, buf);
    G23x4y2 *dp, &lv = *(dp=new (buf) G23x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G23x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y2)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(32,24), "G23x4y2");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), 0, "G23x4y2");
    check_base_class_offset(lv, (C23*)(E23x4*), 0, "G23x4y2");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(16,12), "G23x4y2");
    check_base_class_offset(lv, (E23x4*), 0, "G23x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G23x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G23x4y2.ff");
    test_class_info(&lv, &cd_G23x4y2);
    dp->~G23x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y2(Test_G23x4y2, "G23x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G23x4y2C1Ev();
extern void _ZN7G23x4y2D1Ev();
Name_Map name_map_G23x4y2[] = {
  NSPAIR(_ZN7G23x4y2C1Ev),
  NSPAIR(_ZN7G23x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y2[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y2[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G23x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x4y2[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y2[] = {
  {&(_ZTV7G23x4y2[4]),  4,13},
  {&(_tg__ZTV5E23x4__7G23x4y2[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y2[3]),  3,4},
  {&(_ZTV7G23x4y2[8]),  8,13},
  {&(_ZTV7G23x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G23x4y2[];
extern  VTBL_ENTRY _ZTV7G23x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y2[];
static VTBL_ENTRY alt_thunk_names20[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y2 = {  "G23x4y2", // class name
  bases_G23x4y2, 6,
  &(vtc_G23x4y2[0]), // expected_vtbl_contents
  &(vtt_G23x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G23x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names20,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y3  : virtual E23x4 , virtual F1 {
  int ff;
  ~G23x4y3(); // tgen
  G23x4y3(); // tgen
};
//SIG(1 G23x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x4y3 ::~G23x4y3(){ note_dtor("G23x4y3", this);} // tgen
G23x4y3 ::G23x4y3(){ note_ctor("G23x4y3", this);} // tgen

static void Test_G23x4y3()
{
  extern Class_Descriptor cd_G23x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x4y3, buf);
    G23x4y3 *dp, &lv = *(dp=new (buf) G23x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y3)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(40,28), "G23x4y3");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), ABISELECT(16,8), "G23x4y3");
    check_base_class_offset(lv, (C23*)(E23x4*), ABISELECT(16,8), "G23x4y3");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(32,20), "G23x4y3");
    check_base_class_offset(lv, (E23x4*), ABISELECT(16,8), "G23x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G23x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x4y3.ff");
    test_class_info(&lv, &cd_G23x4y3);
    dp->~G23x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y3(Test_G23x4y3, "G23x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G23x4y3C1Ev();
extern void _ZN7G23x4y3D1Ev();
Name_Map name_map_G23x4y3[] = {
  NSPAIR(_ZN7G23x4y3C1Ev),
  NSPAIR(_ZN7G23x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y3[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x4y3[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G23x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x4y3[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y3[] = {
  {&(_ZTV7G23x4y3[5]),  5,18},
  {&(_ZTV7G23x4y3[9]),  9,18},
  {&(_ZTV7G23x4y3[13]),  13,18},
  {&(_ZTV7G23x4y3[17]),  17,18},
  {&(_tg__ZTV5E23x4__7G23x4y3[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x4y3[];
extern  VTBL_ENTRY _ZTV7G23x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y3[];
static VTBL_ENTRY alt_thunk_names21[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y3 = {  "G23x4y3", // class name
  bases_G23x4y3, 6,
  &(vtc_G23x4y3[0]), // expected_vtbl_contents
  &(vtt_G23x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G23x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names21,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y4  : E23x4 , F0 {
  int ff;
  ~G23x4y4(); // tgen
  G23x4y4(); // tgen
};
//SIG(1 G23x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G23x4y4 ::~G23x4y4(){ note_dtor("G23x4y4", this);} // tgen
G23x4y4 ::G23x4y4(){ note_ctor("G23x4y4", this);} // tgen

static void Test_G23x4y4()
{
  extern Class_Descriptor cd_G23x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x4y4, buf);
    G23x4y4 *dp, &lv = *(dp=new (buf) G23x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y4)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(32,28), "G23x4y4");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), 0, "G23x4y4");
    check_base_class_offset(lv, (C23*)(E23x4*), 0, "G23x4y4");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(16,12), "G23x4y4");
    check_base_class_offset(lv, (E23x4*), 0, "G23x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G23x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G23x4y4.ff");
    test_class_info(&lv, &cd_G23x4y4);
    dp->~G23x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y4(Test_G23x4y4, "G23x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G23x4y4C1Ev();
extern void _ZN7G23x4y4D1Ev();
Name_Map name_map_G23x4y4[] = {
  NSPAIR(_ZN7G23x4y4C1Ev),
  NSPAIR(_ZN7G23x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y4[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G23x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x4y4[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y4[] = {
  {&(_ZTV7G23x4y4[3]),  3,8},
  {&(_tg__ZTV5E23x4__7G23x4y4[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y4[3]),  3,4},
  {&(_ZTV7G23x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G23x4y4[];
extern  VTBL_ENTRY _ZTV7G23x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y4[];
static VTBL_ENTRY alt_thunk_names22[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn28_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y4 = {  "G23x4y4", // class name
  bases_G23x4y4, 6,
  &(vtc_G23x4y4[0]), // expected_vtbl_contents
  &(vtt_G23x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G23x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names22,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y5  : virtual E23x4 , F0 {
  int ff;
  ~G23x4y5(); // tgen
  G23x4y5(); // tgen
};
//SIG(1 G23x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G23x4y5 ::~G23x4y5(){ note_dtor("G23x4y5", this);} // tgen
G23x4y5 ::G23x4y5(){ note_ctor("G23x4y5", this);} // tgen

static void Test_G23x4y5()
{
  extern Class_Descriptor cd_G23x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x4y5, buf);
    G23x4y5 *dp, &lv = *(dp=new (buf) G23x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y5)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(40,32), "G23x4y5");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), ABISELECT(16,12), "G23x4y5");
    check_base_class_offset(lv, (C23*)(E23x4*), ABISELECT(16,12), "G23x4y5");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(32,24), "G23x4y5");
    check_base_class_offset(lv, (E23x4*), ABISELECT(16,12), "G23x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x4y5.ff");
    test_class_info(&lv, &cd_G23x4y5);
    dp->~G23x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y5(Test_G23x4y5, "G23x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x4y5C1Ev();
extern void _ZN7G23x4y5D1Ev();
Name_Map name_map_G23x4y5[] = {
  NSPAIR(_ZN7G23x4y5C1Ev),
  NSPAIR(_ZN7G23x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y5[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x4y5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G23x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x4y5[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y5[] = {
  {&(_ZTV7G23x4y5[4]),  4,13},
  {&(_ZTV7G23x4y5[8]),  8,13},
  {&(_ZTV7G23x4y5[12]),  12,13},
  {&(_tg__ZTV5E23x4__7G23x4y5[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x4y5[];
extern  VTBL_ENTRY _ZTV7G23x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y5[];
static VTBL_ENTRY alt_thunk_names23[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y5 = {  "G23x4y5", // class name
  bases_G23x4y5, 6,
  &(vtc_G23x4y5[0]), // expected_vtbl_contents
  &(vtt_G23x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names23,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y6  : E23x4 , virtual F0 {
  int ff;
  ~G23x4y6(); // tgen
  G23x4y6(); // tgen
};
//SIG(1 G23x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x4y6 ::~G23x4y6(){ note_dtor("G23x4y6", this);} // tgen
G23x4y6 ::G23x4y6(){ note_ctor("G23x4y6", this);} // tgen

static void Test_G23x4y6()
{
  extern Class_Descriptor cd_G23x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x4y6, buf);
    G23x4y6 *dp, &lv = *(dp=new (buf) G23x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y6)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(32,24), "G23x4y6");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), 0, "G23x4y6");
    check_base_class_offset(lv, (C23*)(E23x4*), 0, "G23x4y6");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(16,12), "G23x4y6");
    check_base_class_offset(lv, (E23x4*), 0, "G23x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G23x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G23x4y6.ff");
    test_class_info(&lv, &cd_G23x4y6);
    dp->~G23x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y6(Test_G23x4y6, "G23x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G23x4y6C1Ev();
extern void _ZN7G23x4y6D1Ev();
Name_Map name_map_G23x4y6[] = {
  NSPAIR(_ZN7G23x4y6C1Ev),
  NSPAIR(_ZN7G23x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y6[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x4y6[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y6[] = {
  {&(_ZTV7G23x4y6[4]),  4,9},
  {&(_tg__ZTV5E23x4__7G23x4y6[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y6[3]),  3,4},
  {&(_ZTV7G23x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G23x4y6[];
extern  VTBL_ENTRY _ZTV7G23x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y6[];
static VTBL_ENTRY alt_thunk_names24[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y6 = {  "G23x4y6", // class name
  bases_G23x4y6, 6,
  &(vtc_G23x4y6[0]), // expected_vtbl_contents
  &(vtt_G23x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G23x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names24,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x4y7  : virtual E23x4 , virtual F0 {
  int ff;
  ~G23x4y7(); // tgen
  G23x4y7(); // tgen
};
//SIG(1 G23x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x4y7 ::~G23x4y7(){ note_dtor("G23x4y7", this);} // tgen
G23x4y7 ::G23x4y7(){ note_ctor("G23x4y7", this);} // tgen

static void Test_G23x4y7()
{
  extern Class_Descriptor cd_G23x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x4y7, buf);
    G23x4y7 *dp, &lv = *(dp=new (buf) G23x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x4y7)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x4*), ABISELECT(40,28), "G23x4y7");
    check_base_class_offset(lv, (B1*)(C23*)(E23x4*), ABISELECT(16,8), "G23x4y7");
    check_base_class_offset(lv, (C23*)(E23x4*), ABISELECT(16,8), "G23x4y7");
    check_base_class_offset(lv, (D0*)(E23x4*), ABISELECT(32,20), "G23x4y7");
    check_base_class_offset(lv, (E23x4*), ABISELECT(16,8), "G23x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G23x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x4y7.ff");
    test_class_info(&lv, &cd_G23x4y7);
    dp->~G23x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x4y7(Test_G23x4y7, "G23x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x4y7C1Ev();
extern void _ZN7G23x4y7D1Ev();
Name_Map name_map_G23x4y7[] = {
  NSPAIR(_ZN7G23x4y7C1Ev),
  NSPAIR(_ZN7G23x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x4;
extern VTBL_ENTRY _ZTI5E23x4[];
extern  VTBL_ENTRY _ZTV5E23x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x4y7[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x4y7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x4y7[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x4__7G23x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x4__7G23x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x4__7G23x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x4__7G23x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x4y7[] = {
  {&(_ZTV7G23x4y7[5]),  5,14},
  {&(_ZTV7G23x4y7[9]),  9,14},
  {&(_ZTV7G23x4y7[13]),  13,14},
  {&(_tg__ZTV5E23x4__7G23x4y7[3]),  3,4},
  {&(_tg__ZTV3C235E23x4__7G23x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x4__7G23x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x4__7G23x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x4y7[];
extern  VTBL_ENTRY _ZTV7G23x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x4y7[];
static VTBL_ENTRY alt_thunk_names25[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x4y7 = {  "G23x4y7", // class name
  bases_G23x4y7, 6,
  &(vtc_G23x4y7[0]), // expected_vtbl_contents
  &(vtt_G23x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x4y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x4y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names25,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x4  : C24 , D0 {
  int fd;
  ~E24x4(); // tgen
  E24x4(); // tgen
};
//SIG(-1 E24x4) C1{ BC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E24x4 ::~E24x4(){ note_dtor("E24x4", this);} // tgen
E24x4 ::E24x4(){ note_ctor("E24x4", this);} // tgen

static void Test_E24x4()
{
  extern Class_Descriptor cd_E24x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E24x4, buf);
    E24x4 *dp, &lv = *(dp=new (buf) E24x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E24x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x4)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(8,4), "E24x4");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(24,20), "E24x4");
    check_base_class_offset(lv, (C24*), 0, "E24x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E24x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E24x4.fd");
    test_class_info(&lv, &cd_E24x4);
    dp->~E24x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x4(Test_E24x4, "E24x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E24x4C1Ev();
extern void _ZN5E24x4D1Ev();
Name_Map name_map_E24x4[] = {
  NSPAIR(_ZN5E24x4C1Ev),
  NSPAIR(_ZN5E24x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E24x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E24x4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_E24x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV5E24x4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x4[] = {
  {&(_ZTV5E24x4[3]),  3,4},
  {&(_tg__ZTV3C24__5E24x4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
Class_Descriptor cd_E24x4 = {  "E24x4", // class name
  bases_E24x4, 4,
  &(vtc_E24x4[0]), // expected_vtbl_contents
  &(vtt_E24x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E24x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E24x4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E24x4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y0  : E24x4 , F1 {
  int ff;
  ~G24x4y0(); // tgen
  G24x4y0(); // tgen
};
//SIG(1 G24x4y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x4y0 ::~G24x4y0(){ note_dtor("G24x4y0", this);} // tgen
G24x4y0 ::G24x4y0(){ note_ctor("G24x4y0", this);} // tgen

static void Test_G24x4y0()
{
  extern Class_Descriptor cd_G24x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x4y0, buf);
    G24x4y0 *dp, &lv = *(dp=new (buf) G24x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y0)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(8,4), "G24x4y0");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(40,32), "G24x4y0");
    check_base_class_offset(lv, (C24*)(E24x4*), 0, "G24x4y0");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(16,12), "G24x4y0");
    check_base_class_offset(lv, (E24x4*), 0, "G24x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G24x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G24x4y0.ff");
    test_class_info(&lv, &cd_G24x4y0);
    dp->~G24x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y0(Test_G24x4y0, "G24x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x4y0C1Ev();
extern void _ZN7G24x4y0D1Ev();
Name_Map name_map_G24x4y0[] = {
  NSPAIR(_ZN7G24x4y0C1Ev),
  NSPAIR(_ZN7G24x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y0[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y0[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G24x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y0[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y0[] = {
  {&(_ZTV7G24x4y0[3]),  3,7},
  {&(_tg__ZTV5E24x4__7G24x4y0[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y0[];
extern  VTBL_ENTRY _ZTV7G24x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y0[];
Class_Descriptor cd_G24x4y0 = {  "G24x4y0", // class name
  bases_G24x4y0, 6,
  &(vtc_G24x4y0[0]), // expected_vtbl_contents
  &(vtt_G24x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y1  : virtual E24x4 , F1 {
  int ff;
  ~G24x4y1(); // tgen
  G24x4y1(); // tgen
};
//SIG(1 G24x4y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x4y1 ::~G24x4y1(){ note_dtor("G24x4y1", this);} // tgen
G24x4y1 ::G24x4y1(){ note_ctor("G24x4y1", this);} // tgen

static void Test_G24x4y1()
{
  extern Class_Descriptor cd_G24x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x4y1, buf);
    G24x4y1 *dp, &lv = *(dp=new (buf) G24x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y1)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(24,16), "G24x4y1");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(40,32), "G24x4y1");
    check_base_class_offset(lv, (C24*)(E24x4*), ABISELECT(16,12), "G24x4y1");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(32,24), "G24x4y1");
    check_base_class_offset(lv, (E24x4*), ABISELECT(16,12), "G24x4y1");
    check_base_class_offset(lv, (F1*), 0, "G24x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x4y1.ff");
    test_class_info(&lv, &cd_G24x4y1);
    dp->~G24x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y1(Test_G24x4y1, "G24x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x4y1C1Ev();
extern void _ZN7G24x4y1D1Ev();
Name_Map name_map_G24x4y1[] = {
  NSPAIR(_ZN7G24x4y1C1Ev),
  NSPAIR(_ZN7G24x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x4y1[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y1[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y1[] = {
  {&(_ZTV7G24x4y1[4]),  4,10},
  {&(_ZTV7G24x4y1[9]),  9,10},
  {&(_tg__ZTV5E24x4__7G24x4y1[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y1[];
extern  VTBL_ENTRY _ZTV7G24x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y1[];
Class_Descriptor cd_G24x4y1 = {  "G24x4y1", // class name
  bases_G24x4y1, 6,
  &(vtc_G24x4y1[0]), // expected_vtbl_contents
  &(vtt_G24x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y2  : E24x4 , virtual F1 {
  int ff;
  ~G24x4y2(); // tgen
  G24x4y2(); // tgen
};
//SIG(1 G24x4y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x4y2 ::~G24x4y2(){ note_dtor("G24x4y2", this);} // tgen
G24x4y2 ::G24x4y2(){ note_ctor("G24x4y2", this);} // tgen

static void Test_G24x4y2()
{
  extern Class_Descriptor cd_G24x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x4y2, buf);
    G24x4y2 *dp, &lv = *(dp=new (buf) G24x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y2)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(8,4), "G24x4y2");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(28,24), "G24x4y2");
    check_base_class_offset(lv, (C24*)(E24x4*), 0, "G24x4y2");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(16,12), "G24x4y2");
    check_base_class_offset(lv, (E24x4*), 0, "G24x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G24x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G24x4y2.ff");
    test_class_info(&lv, &cd_G24x4y2);
    dp->~G24x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y2(Test_G24x4y2, "G24x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x4y2C1Ev();
extern void _ZN7G24x4y2D1Ev();
Name_Map name_map_G24x4y2[] = {
  NSPAIR(_ZN7G24x4y2C1Ev),
  NSPAIR(_ZN7G24x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y2[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y2[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G24x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y2[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y2[] = {
  {&(_ZTV7G24x4y2[4]),  4,9},
  {&(_tg__ZTV5E24x4__7G24x4y2[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y2[3]),  3,4},
  {&(_ZTV7G24x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G24x4y2[];
extern  VTBL_ENTRY _ZTV7G24x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y2[];
Class_Descriptor cd_G24x4y2 = {  "G24x4y2", // class name
  bases_G24x4y2, 6,
  &(vtc_G24x4y2[0]), // expected_vtbl_contents
  &(vtt_G24x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y3  : virtual E24x4 , virtual F1 {
  int ff;
  ~G24x4y3(); // tgen
  G24x4y3(); // tgen
};
//SIG(1 G24x4y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x4y3 ::~G24x4y3(){ note_dtor("G24x4y3", this);} // tgen
G24x4y3 ::G24x4y3(){ note_ctor("G24x4y3", this);} // tgen

static void Test_G24x4y3()
{
  extern Class_Descriptor cd_G24x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x4y3, buf);
    G24x4y3 *dp, &lv = *(dp=new (buf) G24x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y3)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(24,12), "G24x4y3");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(40,28), "G24x4y3");
    check_base_class_offset(lv, (C24*)(E24x4*), ABISELECT(16,8), "G24x4y3");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(32,20), "G24x4y3");
    check_base_class_offset(lv, (E24x4*), ABISELECT(16,8), "G24x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G24x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x4y3.ff");
    test_class_info(&lv, &cd_G24x4y3);
    dp->~G24x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y3(Test_G24x4y3, "G24x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G24x4y3C1Ev();
extern void _ZN7G24x4y3D1Ev();
Name_Map name_map_G24x4y3[] = {
  NSPAIR(_ZN7G24x4y3C1Ev),
  NSPAIR(_ZN7G24x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y3[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x4y3[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G24x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y3[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y3[] = {
  {&(_ZTV7G24x4y3[5]),  5,14},
  {&(_ZTV7G24x4y3[9]),  9,14},
  {&(_ZTV7G24x4y3[13]),  13,14},
  {&(_tg__ZTV5E24x4__7G24x4y3[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y3[];
extern  VTBL_ENTRY _ZTV7G24x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y3[];
Class_Descriptor cd_G24x4y3 = {  "G24x4y3", // class name
  bases_G24x4y3, 6,
  &(vtc_G24x4y3[0]), // expected_vtbl_contents
  &(vtt_G24x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G24x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y4  : E24x4 , F0 {
  int ff;
  ~G24x4y4(); // tgen
  G24x4y4(); // tgen
};
//SIG(1 G24x4y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G24x4y4 ::~G24x4y4(){ note_dtor("G24x4y4", this);} // tgen
G24x4y4 ::G24x4y4(){ note_ctor("G24x4y4", this);} // tgen

static void Test_G24x4y4()
{
  extern Class_Descriptor cd_G24x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x4y4, buf);
    G24x4y4 *dp, &lv = *(dp=new (buf) G24x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y4)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(8,4), "G24x4y4");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(32,28), "G24x4y4");
    check_base_class_offset(lv, (C24*)(E24x4*), 0, "G24x4y4");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(16,12), "G24x4y4");
    check_base_class_offset(lv, (E24x4*), 0, "G24x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G24x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G24x4y4.ff");
    test_class_info(&lv, &cd_G24x4y4);
    dp->~G24x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y4(Test_G24x4y4, "G24x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G24x4y4C1Ev();
extern void _ZN7G24x4y4D1Ev();
Name_Map name_map_G24x4y4[] = {
  NSPAIR(_ZN7G24x4y4C1Ev),
  NSPAIR(_ZN7G24x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y4[] = {
  {&(_ZTV7G24x4y4[3]),  3,4},
  {&(_tg__ZTV5E24x4__7G24x4y4[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y4[];
extern  VTBL_ENTRY _ZTV7G24x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y4[];
Class_Descriptor cd_G24x4y4 = {  "G24x4y4", // class name
  bases_G24x4y4, 6,
  &(vtc_G24x4y4[0]), // expected_vtbl_contents
  &(vtt_G24x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G24x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y5  : virtual E24x4 , F0 {
  int ff;
  ~G24x4y5(); // tgen
  G24x4y5(); // tgen
};
//SIG(1 G24x4y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G24x4y5 ::~G24x4y5(){ note_dtor("G24x4y5", this);} // tgen
G24x4y5 ::G24x4y5(){ note_ctor("G24x4y5", this);} // tgen

static void Test_G24x4y5()
{
  extern Class_Descriptor cd_G24x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x4y5, buf);
    G24x4y5 *dp, &lv = *(dp=new (buf) G24x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y5)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(24,16), "G24x4y5");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(40,32), "G24x4y5");
    check_base_class_offset(lv, (C24*)(E24x4*), ABISELECT(16,12), "G24x4y5");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(32,24), "G24x4y5");
    check_base_class_offset(lv, (E24x4*), ABISELECT(16,12), "G24x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x4y5.ff");
    test_class_info(&lv, &cd_G24x4y5);
    dp->~G24x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y5(Test_G24x4y5, "G24x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x4y5C1Ev();
extern void _ZN7G24x4y5D1Ev();
Name_Map name_map_G24x4y5[] = {
  NSPAIR(_ZN7G24x4y5C1Ev),
  NSPAIR(_ZN7G24x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x4y5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y5[] = {
  {&(_ZTV7G24x4y5[4]),  4,9},
  {&(_ZTV7G24x4y5[8]),  8,9},
  {&(_tg__ZTV5E24x4__7G24x4y5[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y5[];
extern  VTBL_ENTRY _ZTV7G24x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y5[];
Class_Descriptor cd_G24x4y5 = {  "G24x4y5", // class name
  bases_G24x4y5, 6,
  &(vtc_G24x4y5[0]), // expected_vtbl_contents
  &(vtt_G24x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y6  : E24x4 , virtual F0 {
  int ff;
  ~G24x4y6(); // tgen
  G24x4y6(); // tgen
};
//SIG(1 G24x4y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x4y6 ::~G24x4y6(){ note_dtor("G24x4y6", this);} // tgen
G24x4y6 ::G24x4y6(){ note_ctor("G24x4y6", this);} // tgen

static void Test_G24x4y6()
{
  extern Class_Descriptor cd_G24x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x4y6, buf);
    G24x4y6 *dp, &lv = *(dp=new (buf) G24x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y6)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(8,4), "G24x4y6");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(28,24), "G24x4y6");
    check_base_class_offset(lv, (C24*)(E24x4*), 0, "G24x4y6");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(16,12), "G24x4y6");
    check_base_class_offset(lv, (E24x4*), 0, "G24x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G24x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G24x4y6.ff");
    test_class_info(&lv, &cd_G24x4y6);
    dp->~G24x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y6(Test_G24x4y6, "G24x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G24x4y6C1Ev();
extern void _ZN7G24x4y6D1Ev();
Name_Map name_map_G24x4y6[] = {
  NSPAIR(_ZN7G24x4y6C1Ev),
  NSPAIR(_ZN7G24x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y6[] = {
  {&(_ZTV7G24x4y6[4]),  4,5},
  {&(_tg__ZTV5E24x4__7G24x4y6[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y6[];
extern  VTBL_ENTRY _ZTV7G24x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y6[];
Class_Descriptor cd_G24x4y6 = {  "G24x4y6", // class name
  bases_G24x4y6, 6,
  &(vtc_G24x4y6[0]), // expected_vtbl_contents
  &(vtt_G24x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G24x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x4y7  : virtual E24x4 , virtual F0 {
  int ff;
  ~G24x4y7(); // tgen
  G24x4y7(); // tgen
};
//SIG(1 G24x4y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x4y7 ::~G24x4y7(){ note_dtor("G24x4y7", this);} // tgen
G24x4y7 ::G24x4y7(){ note_ctor("G24x4y7", this);} // tgen

static void Test_G24x4y7()
{
  extern Class_Descriptor cd_G24x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x4y7, buf);
    G24x4y7 *dp, &lv = *(dp=new (buf) G24x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x4y7)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x4*), ABISELECT(24,12), "G24x4y7");
    check_base_class_offset(lv, (B0*)(C24*)(E24x4*), ABISELECT(40,28), "G24x4y7");
    check_base_class_offset(lv, (C24*)(E24x4*), ABISELECT(16,8), "G24x4y7");
    check_base_class_offset(lv, (D0*)(E24x4*), ABISELECT(32,20), "G24x4y7");
    check_base_class_offset(lv, (E24x4*), ABISELECT(16,8), "G24x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G24x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x4y7.ff");
    test_class_info(&lv, &cd_G24x4y7);
    dp->~G24x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x4y7(Test_G24x4y7, "G24x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x4y7C1Ev();
extern void _ZN7G24x4y7D1Ev();
Name_Map name_map_G24x4y7[] = {
  NSPAIR(_ZN7G24x4y7C1Ev),
  NSPAIR(_ZN7G24x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x4;
extern VTBL_ENTRY _ZTI5E24x4[];
extern  VTBL_ENTRY _ZTV5E24x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x4y7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x4y7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x4y7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x4__7G24x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x4__7G24x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x4y7[] = {
  {&(_ZTV7G24x4y7[5]),  5,10},
  {&(_ZTV7G24x4y7[9]),  9,10},
  {&(_tg__ZTV5E24x4__7G24x4y7[3]),  3,4},
  {&(_tg__ZTV3C245E24x4__7G24x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x4y7[];
extern  VTBL_ENTRY _ZTV7G24x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x4y7[];
Class_Descriptor cd_G24x4y7 = {  "G24x4y7", // class name
  bases_G24x4y7, 6,
  &(vtc_G24x4y7[0]), // expected_vtbl_contents
  &(vtt_G24x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x4y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x4y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E25x4  : C25 , D0 {
  int fd;
  ~E25x4(); // tgen
  E25x4(); // tgen
};
//SIG(-1 E25x4) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E25x4 ::~E25x4(){ note_dtor("E25x4", this);} // tgen
E25x4 ::E25x4(){ note_ctor("E25x4", this);} // tgen

static void Test_E25x4()
{
  extern Class_Descriptor cd_E25x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E25x4, buf);
    E25x4 *dp, &lv = *(dp=new (buf) E25x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E25x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x4)");
    check_base_class_offset(lv, (A1*)(C25*), 0, "E25x4");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(24,20), "E25x4");
    check_base_class_offset(lv, (C25*), 0, "E25x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E25x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E25x4.fd");
    test_class_info(&lv, &cd_E25x4);
    dp->~E25x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x4(Test_E25x4, "E25x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E25x4C1Ev();
extern void _ZN5E25x4D1Ev();
Name_Map name_map_E25x4[] = {
  NSPAIR(_ZN5E25x4C1Ev),
  NSPAIR(_ZN5E25x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E25x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E25x4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_E25x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV5E25x4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x4[] = {
  {&(_ZTV5E25x4[3]),  3,4},
  {&(_tg__ZTV3C25__5E25x4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
Class_Descriptor cd_E25x4 = {  "E25x4", // class name
  bases_E25x4, 4,
  &(vtc_E25x4[0]), // expected_vtbl_contents
  &(vtt_E25x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E25x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E25x4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E25x4),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y0  : E25x4 , F1 {
  int ff;
  ~G25x4y0(); // tgen
  G25x4y0(); // tgen
};
//SIG(1 G25x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x4y0 ::~G25x4y0(){ note_dtor("G25x4y0", this);} // tgen
G25x4y0 ::G25x4y0(){ note_ctor("G25x4y0", this);} // tgen

static void Test_G25x4y0()
{
  extern Class_Descriptor cd_G25x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x4y0, buf);
    G25x4y0 *dp, &lv = *(dp=new (buf) G25x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y0)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), 0, "G25x4y0");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(40,32), "G25x4y0");
    check_base_class_offset(lv, (C25*)(E25x4*), 0, "G25x4y0");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(16,12), "G25x4y0");
    check_base_class_offset(lv, (E25x4*), 0, "G25x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G25x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G25x4y0.ff");
    test_class_info(&lv, &cd_G25x4y0);
    dp->~G25x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y0(Test_G25x4y0, "G25x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x4y0C1Ev();
extern void _ZN7G25x4y0D1Ev();
Name_Map name_map_G25x4y0[] = {
  NSPAIR(_ZN7G25x4y0C1Ev),
  NSPAIR(_ZN7G25x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y0[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y0[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G25x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y0[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y0[] = {
  {&(_ZTV7G25x4y0[3]),  3,7},
  {&(_tg__ZTV5E25x4__7G25x4y0[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y0[];
extern  VTBL_ENTRY _ZTV7G25x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y0[];
Class_Descriptor cd_G25x4y0 = {  "G25x4y0", // class name
  bases_G25x4y0, 6,
  &(vtc_G25x4y0[0]), // expected_vtbl_contents
  &(vtt_G25x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y1  : virtual E25x4 , F1 {
  int ff;
  ~G25x4y1(); // tgen
  G25x4y1(); // tgen
};
//SIG(1 G25x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x4y1 ::~G25x4y1(){ note_dtor("G25x4y1", this);} // tgen
G25x4y1 ::G25x4y1(){ note_ctor("G25x4y1", this);} // tgen

static void Test_G25x4y1()
{
  extern Class_Descriptor cd_G25x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x4y1, buf);
    G25x4y1 *dp, &lv = *(dp=new (buf) G25x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y1)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), ABISELECT(16,12), "G25x4y1");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(40,32), "G25x4y1");
    check_base_class_offset(lv, (C25*)(E25x4*), ABISELECT(16,12), "G25x4y1");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(32,24), "G25x4y1");
    check_base_class_offset(lv, (E25x4*), ABISELECT(16,12), "G25x4y1");
    check_base_class_offset(lv, (F1*), 0, "G25x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x4y1.ff");
    test_class_info(&lv, &cd_G25x4y1);
    dp->~G25x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y1(Test_G25x4y1, "G25x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x4y1C1Ev();
extern void _ZN7G25x4y1D1Ev();
Name_Map name_map_G25x4y1[] = {
  NSPAIR(_ZN7G25x4y1C1Ev),
  NSPAIR(_ZN7G25x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x4y1[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y1[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y1[] = {
  {&(_ZTV7G25x4y1[4]),  4,10},
  {&(_ZTV7G25x4y1[9]),  9,10},
  {&(_tg__ZTV5E25x4__7G25x4y1[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y1[];
extern  VTBL_ENTRY _ZTV7G25x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y1[];
Class_Descriptor cd_G25x4y1 = {  "G25x4y1", // class name
  bases_G25x4y1, 6,
  &(vtc_G25x4y1[0]), // expected_vtbl_contents
  &(vtt_G25x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y2  : E25x4 , virtual F1 {
  int ff;
  ~G25x4y2(); // tgen
  G25x4y2(); // tgen
};
//SIG(1 G25x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x4y2 ::~G25x4y2(){ note_dtor("G25x4y2", this);} // tgen
G25x4y2 ::G25x4y2(){ note_ctor("G25x4y2", this);} // tgen

static void Test_G25x4y2()
{
  extern Class_Descriptor cd_G25x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x4y2, buf);
    G25x4y2 *dp, &lv = *(dp=new (buf) G25x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y2)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), 0, "G25x4y2");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(28,24), "G25x4y2");
    check_base_class_offset(lv, (C25*)(E25x4*), 0, "G25x4y2");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(16,12), "G25x4y2");
    check_base_class_offset(lv, (E25x4*), 0, "G25x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G25x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G25x4y2.ff");
    test_class_info(&lv, &cd_G25x4y2);
    dp->~G25x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y2(Test_G25x4y2, "G25x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x4y2C1Ev();
extern void _ZN7G25x4y2D1Ev();
Name_Map name_map_G25x4y2[] = {
  NSPAIR(_ZN7G25x4y2C1Ev),
  NSPAIR(_ZN7G25x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y2[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y2[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G25x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y2[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y2[] = {
  {&(_ZTV7G25x4y2[4]),  4,9},
  {&(_tg__ZTV5E25x4__7G25x4y2[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y2[3]),  3,4},
  {&(_ZTV7G25x4y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G25x4y2[];
extern  VTBL_ENTRY _ZTV7G25x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y2[];
Class_Descriptor cd_G25x4y2 = {  "G25x4y2", // class name
  bases_G25x4y2, 6,
  &(vtc_G25x4y2[0]), // expected_vtbl_contents
  &(vtt_G25x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y3  : virtual E25x4 , virtual F1 {
  int ff;
  ~G25x4y3(); // tgen
  G25x4y3(); // tgen
};
//SIG(1 G25x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x4y3 ::~G25x4y3(){ note_dtor("G25x4y3", this);} // tgen
G25x4y3 ::G25x4y3(){ note_ctor("G25x4y3", this);} // tgen

static void Test_G25x4y3()
{
  extern Class_Descriptor cd_G25x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x4y3, buf);
    G25x4y3 *dp, &lv = *(dp=new (buf) G25x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y3)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), ABISELECT(16,8), "G25x4y3");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(40,28), "G25x4y3");
    check_base_class_offset(lv, (C25*)(E25x4*), ABISELECT(16,8), "G25x4y3");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(32,20), "G25x4y3");
    check_base_class_offset(lv, (E25x4*), ABISELECT(16,8), "G25x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G25x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x4y3.ff");
    test_class_info(&lv, &cd_G25x4y3);
    dp->~G25x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y3(Test_G25x4y3, "G25x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G25x4y3C1Ev();
extern void _ZN7G25x4y3D1Ev();
Name_Map name_map_G25x4y3[] = {
  NSPAIR(_ZN7G25x4y3C1Ev),
  NSPAIR(_ZN7G25x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y3[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x4y3[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G25x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y3[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y3[] = {
  {&(_ZTV7G25x4y3[5]),  5,14},
  {&(_ZTV7G25x4y3[9]),  9,14},
  {&(_ZTV7G25x4y3[13]),  13,14},
  {&(_tg__ZTV5E25x4__7G25x4y3[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y3[];
extern  VTBL_ENTRY _ZTV7G25x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y3[];
Class_Descriptor cd_G25x4y3 = {  "G25x4y3", // class name
  bases_G25x4y3, 6,
  &(vtc_G25x4y3[0]), // expected_vtbl_contents
  &(vtt_G25x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G25x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y4  : E25x4 , F0 {
  int ff;
  ~G25x4y4(); // tgen
  G25x4y4(); // tgen
};
//SIG(1 G25x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G25x4y4 ::~G25x4y4(){ note_dtor("G25x4y4", this);} // tgen
G25x4y4 ::G25x4y4(){ note_ctor("G25x4y4", this);} // tgen

static void Test_G25x4y4()
{
  extern Class_Descriptor cd_G25x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x4y4, buf);
    G25x4y4 *dp, &lv = *(dp=new (buf) G25x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y4)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), 0, "G25x4y4");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(32,28), "G25x4y4");
    check_base_class_offset(lv, (C25*)(E25x4*), 0, "G25x4y4");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(16,12), "G25x4y4");
    check_base_class_offset(lv, (E25x4*), 0, "G25x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G25x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G25x4y4.ff");
    test_class_info(&lv, &cd_G25x4y4);
    dp->~G25x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y4(Test_G25x4y4, "G25x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G25x4y4C1Ev();
extern void _ZN7G25x4y4D1Ev();
Name_Map name_map_G25x4y4[] = {
  NSPAIR(_ZN7G25x4y4C1Ev),
  NSPAIR(_ZN7G25x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y4[] = {
  {&(_ZTV7G25x4y4[3]),  3,4},
  {&(_tg__ZTV5E25x4__7G25x4y4[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y4[];
extern  VTBL_ENTRY _ZTV7G25x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y4[];
Class_Descriptor cd_G25x4y4 = {  "G25x4y4", // class name
  bases_G25x4y4, 6,
  &(vtc_G25x4y4[0]), // expected_vtbl_contents
  &(vtt_G25x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G25x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y5  : virtual E25x4 , F0 {
  int ff;
  ~G25x4y5(); // tgen
  G25x4y5(); // tgen
};
//SIG(1 G25x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G25x4y5 ::~G25x4y5(){ note_dtor("G25x4y5", this);} // tgen
G25x4y5 ::G25x4y5(){ note_ctor("G25x4y5", this);} // tgen

static void Test_G25x4y5()
{
  extern Class_Descriptor cd_G25x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x4y5, buf);
    G25x4y5 *dp, &lv = *(dp=new (buf) G25x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y5)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), ABISELECT(16,12), "G25x4y5");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(40,32), "G25x4y5");
    check_base_class_offset(lv, (C25*)(E25x4*), ABISELECT(16,12), "G25x4y5");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(32,24), "G25x4y5");
    check_base_class_offset(lv, (E25x4*), ABISELECT(16,12), "G25x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x4y5.ff");
    test_class_info(&lv, &cd_G25x4y5);
    dp->~G25x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y5(Test_G25x4y5, "G25x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x4y5C1Ev();
extern void _ZN7G25x4y5D1Ev();
Name_Map name_map_G25x4y5[] = {
  NSPAIR(_ZN7G25x4y5C1Ev),
  NSPAIR(_ZN7G25x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x4y5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y5[] = {
  {&(_ZTV7G25x4y5[4]),  4,9},
  {&(_ZTV7G25x4y5[8]),  8,9},
  {&(_tg__ZTV5E25x4__7G25x4y5[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y5[];
extern  VTBL_ENTRY _ZTV7G25x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y5[];
Class_Descriptor cd_G25x4y5 = {  "G25x4y5", // class name
  bases_G25x4y5, 6,
  &(vtc_G25x4y5[0]), // expected_vtbl_contents
  &(vtt_G25x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y6  : E25x4 , virtual F0 {
  int ff;
  ~G25x4y6(); // tgen
  G25x4y6(); // tgen
};
//SIG(1 G25x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x4y6 ::~G25x4y6(){ note_dtor("G25x4y6", this);} // tgen
G25x4y6 ::G25x4y6(){ note_ctor("G25x4y6", this);} // tgen

static void Test_G25x4y6()
{
  extern Class_Descriptor cd_G25x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x4y6, buf);
    G25x4y6 *dp, &lv = *(dp=new (buf) G25x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y6)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), 0, "G25x4y6");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(28,24), "G25x4y6");
    check_base_class_offset(lv, (C25*)(E25x4*), 0, "G25x4y6");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(16,12), "G25x4y6");
    check_base_class_offset(lv, (E25x4*), 0, "G25x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G25x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G25x4y6.ff");
    test_class_info(&lv, &cd_G25x4y6);
    dp->~G25x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y6(Test_G25x4y6, "G25x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G25x4y6C1Ev();
extern void _ZN7G25x4y6D1Ev();
Name_Map name_map_G25x4y6[] = {
  NSPAIR(_ZN7G25x4y6C1Ev),
  NSPAIR(_ZN7G25x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y6[] = {
  {&(_ZTV7G25x4y6[4]),  4,5},
  {&(_tg__ZTV5E25x4__7G25x4y6[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y6[];
extern  VTBL_ENTRY _ZTV7G25x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y6[];
Class_Descriptor cd_G25x4y6 = {  "G25x4y6", // class name
  bases_G25x4y6, 6,
  &(vtc_G25x4y6[0]), // expected_vtbl_contents
  &(vtt_G25x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G25x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x4y7  : virtual E25x4 , virtual F0 {
  int ff;
  ~G25x4y7(); // tgen
  G25x4y7(); // tgen
};
//SIG(1 G25x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x4y7 ::~G25x4y7(){ note_dtor("G25x4y7", this);} // tgen
G25x4y7 ::G25x4y7(){ note_ctor("G25x4y7", this);} // tgen

static void Test_G25x4y7()
{
  extern Class_Descriptor cd_G25x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x4y7, buf);
    G25x4y7 *dp, &lv = *(dp=new (buf) G25x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x4y7)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x4*), ABISELECT(16,8), "G25x4y7");
    check_base_class_offset(lv, (B0*)(C25*)(E25x4*), ABISELECT(40,28), "G25x4y7");
    check_base_class_offset(lv, (C25*)(E25x4*), ABISELECT(16,8), "G25x4y7");
    check_base_class_offset(lv, (D0*)(E25x4*), ABISELECT(32,20), "G25x4y7");
    check_base_class_offset(lv, (E25x4*), ABISELECT(16,8), "G25x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G25x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x4y7.ff");
    test_class_info(&lv, &cd_G25x4y7);
    dp->~G25x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x4y7(Test_G25x4y7, "G25x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x4y7C1Ev();
extern void _ZN7G25x4y7D1Ev();
Name_Map name_map_G25x4y7[] = {
  NSPAIR(_ZN7G25x4y7C1Ev),
  NSPAIR(_ZN7G25x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x4;
extern VTBL_ENTRY _ZTI5E25x4[];
extern  VTBL_ENTRY _ZTV5E25x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x4y7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x4y7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x4y7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x4__7G25x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x4__7G25x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x4y7[] = {
  {&(_ZTV7G25x4y7[5]),  5,10},
  {&(_ZTV7G25x4y7[9]),  9,10},
  {&(_tg__ZTV5E25x4__7G25x4y7[3]),  3,4},
  {&(_tg__ZTV3C255E25x4__7G25x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x4y7[];
extern  VTBL_ENTRY _ZTV7G25x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x4y7[];
Class_Descriptor cd_G25x4y7 = {  "G25x4y7", // class name
  bases_G25x4y7, 6,
  &(vtc_G25x4y7[0]), // expected_vtbl_contents
  &(vtt_G25x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x4y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x4y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E26x4  : C26 , D0 {
  int fd;
  ~E26x4(); // tgen
  E26x4(); // tgen
};
//SIG(-1 E26x4) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E26x4 ::~E26x4(){ note_dtor("E26x4", this);} // tgen
E26x4 ::E26x4(){ note_ctor("E26x4", this);} // tgen

static void Test_E26x4()
{
  extern Class_Descriptor cd_E26x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E26x4, buf);
    E26x4 *dp, &lv = *(dp=new (buf) E26x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E26x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x4)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(20,16), "E26x4");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(24,20), "E26x4");
    check_base_class_offset(lv, (C26*), 0, "E26x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E26x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E26x4.fd");
    test_class_info(&lv, &cd_E26x4);
    dp->~E26x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x4(Test_E26x4, "E26x4", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E26x4C1Ev();
extern void _ZN5E26x4D1Ev();
Name_Map name_map_E26x4[] = {
  NSPAIR(_ZN5E26x4C1Ev),
  NSPAIR(_ZN5E26x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E26x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E26x4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_E26x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV5E26x4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x4[] = {
  {&(_ZTV5E26x4[4]),  4,5},
  {&(_tg__ZTV3C26__5E26x4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
Class_Descriptor cd_E26x4 = {  "E26x4", // class name
  bases_E26x4, 4,
  &(vtc_E26x4[0]), // expected_vtbl_contents
  &(vtt_E26x4[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E26x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E26x4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E26x4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y0  : E26x4 , F1 {
  int ff;
  ~G26x4y0(); // tgen
  G26x4y0(); // tgen
};
//SIG(1 G26x4y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x4y0 ::~G26x4y0(){ note_dtor("G26x4y0", this);} // tgen
G26x4y0 ::G26x4y0(){ note_ctor("G26x4y0", this);} // tgen

static void Test_G26x4y0()
{
  extern Class_Descriptor cd_G26x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x4y0, buf);
    G26x4y0 *dp, &lv = *(dp=new (buf) G26x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y0)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(40,28), "G26x4y0");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(44,32), "G26x4y0");
    check_base_class_offset(lv, (C26*)(E26x4*), 0, "G26x4y0");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(12,8), "G26x4y0");
    check_base_class_offset(lv, (E26x4*), 0, "G26x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G26x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G26x4y0.ff");
    test_class_info(&lv, &cd_G26x4y0);
    dp->~G26x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y0(Test_G26x4y0, "G26x4y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x4y0C1Ev();
extern void _ZN7G26x4y0D1Ev();
Name_Map name_map_G26x4y0[] = {
  NSPAIR(_ZN7G26x4y0C1Ev),
  NSPAIR(_ZN7G26x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y0[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x4y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y0[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G26x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y0[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y0[] = {
  {&(_ZTV7G26x4y0[4]),  4,8},
  {&(_tg__ZTV5E26x4__7G26x4y0[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y0[];
extern  VTBL_ENTRY _ZTV7G26x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y0[];
Class_Descriptor cd_G26x4y0 = {  "G26x4y0", // class name
  bases_G26x4y0, 6,
  &(vtc_G26x4y0[0]), // expected_vtbl_contents
  &(vtt_G26x4y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y1  : virtual E26x4 , F1 {
  int ff;
  ~G26x4y1(); // tgen
  G26x4y1(); // tgen
};
//SIG(1 G26x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x4y1 ::~G26x4y1(){ note_dtor("G26x4y1", this);} // tgen
G26x4y1 ::G26x4y1(){ note_ctor("G26x4y1", this);} // tgen

static void Test_G26x4y1()
{
  extern Class_Descriptor cd_G26x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x4y1, buf);
    G26x4y1 *dp, &lv = *(dp=new (buf) G26x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y1)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(36,28), "G26x4y1");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(40,32), "G26x4y1");
    check_base_class_offset(lv, (C26*)(E26x4*), ABISELECT(16,12), "G26x4y1");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(28,20), "G26x4y1");
    check_base_class_offset(lv, (E26x4*), ABISELECT(16,12), "G26x4y1");
    check_base_class_offset(lv, (F1*), 0, "G26x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x4y1.ff");
    test_class_info(&lv, &cd_G26x4y1);
    dp->~G26x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y1(Test_G26x4y1, "G26x4y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x4y1C1Ev();
extern void _ZN7G26x4y1D1Ev();
Name_Map name_map_G26x4y1[] = {
  NSPAIR(_ZN7G26x4y1C1Ev),
  NSPAIR(_ZN7G26x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x4y1[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y1[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y1[] = {
  {&(_ZTV7G26x4y1[5]),  5,12},
  {&(_ZTV7G26x4y1[11]),  11,12},
  {&(_tg__ZTV5E26x4__7G26x4y1[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y1[];
extern  VTBL_ENTRY _ZTV7G26x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y1[];
Class_Descriptor cd_G26x4y1 = {  "G26x4y1", // class name
  bases_G26x4y1, 6,
  &(vtc_G26x4y1[0]), // expected_vtbl_contents
  &(vtt_G26x4y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y2  : E26x4 , virtual F1 {
  int ff;
  ~G26x4y2(); // tgen
  G26x4y2(); // tgen
};
//SIG(1 G26x4y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x4y2 ::~G26x4y2(){ note_dtor("G26x4y2", this);} // tgen
G26x4y2 ::G26x4y2(){ note_ctor("G26x4y2", this);} // tgen

static void Test_G26x4y2()
{
  extern Class_Descriptor cd_G26x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x4y2, buf);
    G26x4y2 *dp, &lv = *(dp=new (buf) G26x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y2)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(24,20), "G26x4y2");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(28,24), "G26x4y2");
    check_base_class_offset(lv, (C26*)(E26x4*), 0, "G26x4y2");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(12,8), "G26x4y2");
    check_base_class_offset(lv, (E26x4*), 0, "G26x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G26x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x4y2.ff");
    test_class_info(&lv, &cd_G26x4y2);
    dp->~G26x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y2(Test_G26x4y2, "G26x4y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x4y2C1Ev();
extern void _ZN7G26x4y2D1Ev();
Name_Map name_map_G26x4y2[] = {
  NSPAIR(_ZN7G26x4y2C1Ev),
  NSPAIR(_ZN7G26x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y2[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x4y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y2[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G26x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y2[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y2[] = {
  {&(_ZTV7G26x4y2[5]),  5,10},
  {&(_tg__ZTV5E26x4__7G26x4y2[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y2[4]),  4,5},
  {&(_ZTV7G26x4y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G26x4y2[];
extern  VTBL_ENTRY _ZTV7G26x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y2[];
Class_Descriptor cd_G26x4y2 = {  "G26x4y2", // class name
  bases_G26x4y2, 6,
  &(vtc_G26x4y2[0]), // expected_vtbl_contents
  &(vtt_G26x4y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y3  : virtual E26x4 , virtual F1 {
  int ff;
  ~G26x4y3(); // tgen
  G26x4y3(); // tgen
};
//SIG(1 G26x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x4y3 ::~G26x4y3(){ note_dtor("G26x4y3", this);} // tgen
G26x4y3 ::G26x4y3(){ note_ctor("G26x4y3", this);} // tgen

static void Test_G26x4y3()
{
  extern Class_Descriptor cd_G26x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x4y3, buf);
    G26x4y3 *dp, &lv = *(dp=new (buf) G26x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y3)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(36,24), "G26x4y3");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(40,28), "G26x4y3");
    check_base_class_offset(lv, (C26*)(E26x4*), ABISELECT(16,8), "G26x4y3");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(28,16), "G26x4y3");
    check_base_class_offset(lv, (E26x4*), ABISELECT(16,8), "G26x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G26x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x4y3.ff");
    test_class_info(&lv, &cd_G26x4y3);
    dp->~G26x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y3(Test_G26x4y3, "G26x4y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G26x4y3C1Ev();
extern void _ZN7G26x4y3D1Ev();
Name_Map name_map_G26x4y3[] = {
  NSPAIR(_ZN7G26x4y3C1Ev),
  NSPAIR(_ZN7G26x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y3[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x4y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x4y3[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G26x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y3[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y3[] = {
  {&(_ZTV7G26x4y3[6]),  6,16},
  {&(_ZTV7G26x4y3[11]),  11,16},
  {&(_ZTV7G26x4y3[15]),  15,16},
  {&(_tg__ZTV5E26x4__7G26x4y3[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y3[];
extern  VTBL_ENTRY _ZTV7G26x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y3[];
Class_Descriptor cd_G26x4y3 = {  "G26x4y3", // class name
  bases_G26x4y3, 6,
  &(vtc_G26x4y3[0]), // expected_vtbl_contents
  &(vtt_G26x4y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G26x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y4  : E26x4 , F0 {
  int ff;
  ~G26x4y4(); // tgen
  G26x4y4(); // tgen
};
//SIG(1 G26x4y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G26x4y4 ::~G26x4y4(){ note_dtor("G26x4y4", this);} // tgen
G26x4y4 ::G26x4y4(){ note_ctor("G26x4y4", this);} // tgen

static void Test_G26x4y4()
{
  extern Class_Descriptor cd_G26x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x4y4, buf);
    G26x4y4 *dp, &lv = *(dp=new (buf) G26x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y4)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(28,24), "G26x4y4");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(32,28), "G26x4y4");
    check_base_class_offset(lv, (C26*)(E26x4*), 0, "G26x4y4");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(12,8), "G26x4y4");
    check_base_class_offset(lv, (E26x4*), 0, "G26x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G26x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G26x4y4.ff");
    test_class_info(&lv, &cd_G26x4y4);
    dp->~G26x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y4(Test_G26x4y4, "G26x4y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G26x4y4C1Ev();
extern void _ZN7G26x4y4D1Ev();
Name_Map name_map_G26x4y4[] = {
  NSPAIR(_ZN7G26x4y4C1Ev),
  NSPAIR(_ZN7G26x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y4[] = {
  {&(_ZTV7G26x4y4[4]),  4,5},
  {&(_tg__ZTV5E26x4__7G26x4y4[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y4[];
extern  VTBL_ENTRY _ZTV7G26x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y4[];
Class_Descriptor cd_G26x4y4 = {  "G26x4y4", // class name
  bases_G26x4y4, 6,
  &(vtc_G26x4y4[0]), // expected_vtbl_contents
  &(vtt_G26x4y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G26x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y5  : virtual E26x4 , F0 {
  int ff;
  ~G26x4y5(); // tgen
  G26x4y5(); // tgen
};
//SIG(1 G26x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G26x4y5 ::~G26x4y5(){ note_dtor("G26x4y5", this);} // tgen
G26x4y5 ::G26x4y5(){ note_ctor("G26x4y5", this);} // tgen

static void Test_G26x4y5()
{
  extern Class_Descriptor cd_G26x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x4y5, buf);
    G26x4y5 *dp, &lv = *(dp=new (buf) G26x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y5)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(36,28), "G26x4y5");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(40,32), "G26x4y5");
    check_base_class_offset(lv, (C26*)(E26x4*), ABISELECT(16,12), "G26x4y5");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(28,20), "G26x4y5");
    check_base_class_offset(lv, (E26x4*), ABISELECT(16,12), "G26x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x4y5.ff");
    test_class_info(&lv, &cd_G26x4y5);
    dp->~G26x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y5(Test_G26x4y5, "G26x4y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x4y5C1Ev();
extern void _ZN7G26x4y5D1Ev();
Name_Map name_map_G26x4y5[] = {
  NSPAIR(_ZN7G26x4y5C1Ev),
  NSPAIR(_ZN7G26x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x4y5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y5[] = {
  {&(_ZTV7G26x4y5[5]),  5,11},
  {&(_ZTV7G26x4y5[10]),  10,11},
  {&(_tg__ZTV5E26x4__7G26x4y5[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y5[];
extern  VTBL_ENTRY _ZTV7G26x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y5[];
Class_Descriptor cd_G26x4y5 = {  "G26x4y5", // class name
  bases_G26x4y5, 6,
  &(vtc_G26x4y5[0]), // expected_vtbl_contents
  &(vtt_G26x4y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y6  : E26x4 , virtual F0 {
  int ff;
  ~G26x4y6(); // tgen
  G26x4y6(); // tgen
};
//SIG(1 G26x4y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x4y6 ::~G26x4y6(){ note_dtor("G26x4y6", this);} // tgen
G26x4y6 ::G26x4y6(){ note_ctor("G26x4y6", this);} // tgen

static void Test_G26x4y6()
{
  extern Class_Descriptor cd_G26x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x4y6, buf);
    G26x4y6 *dp, &lv = *(dp=new (buf) G26x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y6)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(24,20), "G26x4y6");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(28,24), "G26x4y6");
    check_base_class_offset(lv, (C26*)(E26x4*), 0, "G26x4y6");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(12,8), "G26x4y6");
    check_base_class_offset(lv, (E26x4*), 0, "G26x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G26x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x4y6.ff");
    test_class_info(&lv, &cd_G26x4y6);
    dp->~G26x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y6(Test_G26x4y6, "G26x4y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G26x4y6C1Ev();
extern void _ZN7G26x4y6D1Ev();
Name_Map name_map_G26x4y6[] = {
  NSPAIR(_ZN7G26x4y6C1Ev),
  NSPAIR(_ZN7G26x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x4y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y6[] = {
  {&(_ZTV7G26x4y6[5]),  5,6},
  {&(_tg__ZTV5E26x4__7G26x4y6[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y6[];
extern  VTBL_ENTRY _ZTV7G26x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y6[];
Class_Descriptor cd_G26x4y6 = {  "G26x4y6", // class name
  bases_G26x4y6, 6,
  &(vtc_G26x4y6[0]), // expected_vtbl_contents
  &(vtt_G26x4y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G26x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x4y7  : virtual E26x4 , virtual F0 {
  int ff;
  ~G26x4y7(); // tgen
  G26x4y7(); // tgen
};
//SIG(1 G26x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x4y7 ::~G26x4y7(){ note_dtor("G26x4y7", this);} // tgen
G26x4y7 ::G26x4y7(){ note_ctor("G26x4y7", this);} // tgen

static void Test_G26x4y7()
{
  extern Class_Descriptor cd_G26x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x4y7, buf);
    G26x4y7 *dp, &lv = *(dp=new (buf) G26x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x4y7)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x4*), ABISELECT(36,24), "G26x4y7");
    check_base_class_offset(lv, (B0*)(C26*)(E26x4*), ABISELECT(40,28), "G26x4y7");
    check_base_class_offset(lv, (C26*)(E26x4*), ABISELECT(16,8), "G26x4y7");
    check_base_class_offset(lv, (D0*)(E26x4*), ABISELECT(28,16), "G26x4y7");
    check_base_class_offset(lv, (E26x4*), ABISELECT(16,8), "G26x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G26x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x4y7.ff");
    test_class_info(&lv, &cd_G26x4y7);
    dp->~G26x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x4y7(Test_G26x4y7, "G26x4y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x4y7C1Ev();
extern void _ZN7G26x4y7D1Ev();
Name_Map name_map_G26x4y7[] = {
  NSPAIR(_ZN7G26x4y7C1Ev),
  NSPAIR(_ZN7G26x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x4;
extern VTBL_ENTRY _ZTI5E26x4[];
extern  VTBL_ENTRY _ZTV5E26x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x4y7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x4y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x4y7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x4y7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x4__7G26x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x4__7G26x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x4y7[] = {
  {&(_ZTV7G26x4y7[6]),  6,12},
  {&(_ZTV7G26x4y7[11]),  11,12},
  {&(_tg__ZTV5E26x4__7G26x4y7[4]),  4,5},
  {&(_tg__ZTV3C265E26x4__7G26x4y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x4y7[];
extern  VTBL_ENTRY _ZTV7G26x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x4y7[];
Class_Descriptor cd_G26x4y7 = {  "G26x4y7", // class name
  bases_G26x4y7, 6,
  &(vtc_G26x4y7[0]), // expected_vtbl_contents
  &(vtt_G26x4y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x4y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x4y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E27x4  : C27 , D0 {
  int fd;
  ~E27x4(); // tgen
  E27x4(); // tgen
};
//SIG(-1 E27x4) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E27x4 ::~E27x4(){ note_dtor("E27x4", this);} // tgen
E27x4 ::E27x4(){ note_ctor("E27x4", this);} // tgen

static void Test_E27x4()
{
  extern Class_Descriptor cd_E27x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E27x4, buf);
    E27x4 *dp, &lv = *(dp=new (buf) E27x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E27x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x4)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(24,16), "E27x4");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(36,24), "E27x4");
    check_base_class_offset(lv, (C27*), 0, "E27x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E27x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E27x4.fd");
    test_class_info(&lv, &cd_E27x4);
    dp->~E27x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x4(Test_E27x4, "E27x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E27x4C1Ev();
extern void _ZN5E27x4D1Ev();
Name_Map name_map_E27x4[] = {
  NSPAIR(_ZN5E27x4C1Ev),
  NSPAIR(_ZN5E27x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E27x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E27x4[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x4[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV5E27x4[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x4[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__5E27x4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x4[] = {
  {&(_ZTV5E27x4[4]),  4,9},
  {&(_tg__ZTV3C27__5E27x4[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__5E27x4[3]),  3,4},
  {&(_ZTV5E27x4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
static VTBL_ENTRY alt_thunk_names26[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x4 = {  "E27x4", // class name
  bases_E27x4, 4,
  &(vtc_E27x4[0]), // expected_vtbl_contents
  &(vtt_E27x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E27x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E27x4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E27x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names26,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y0  : E27x4 , F1 {
  int ff;
  ~G27x4y0(); // tgen
  G27x4y0(); // tgen
};
//SIG(1 G27x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x4y0 ::~G27x4y0(){ note_dtor("G27x4y0", this);} // tgen
G27x4y0 ::G27x4y0(){ note_ctor("G27x4y0", this);} // tgen

static void Test_G27x4y0()
{
  extern Class_Descriptor cd_G27x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x4y0, buf);
    G27x4y0 *dp, &lv = *(dp=new (buf) G27x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y0)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(40,28), "G27x4y0");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(52,36), "G27x4y0");
    check_base_class_offset(lv, (C27*)(E27x4*), 0, "G27x4y0");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(12,8), "G27x4y0");
    check_base_class_offset(lv, (E27x4*), 0, "G27x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G27x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G27x4y0.ff");
    test_class_info(&lv, &cd_G27x4y0);
    dp->~G27x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y0(Test_G27x4y0, "G27x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x4y0C1Ev();
extern void _ZN7G27x4y0D1Ev();
Name_Map name_map_G27x4y0[] = {
  NSPAIR(_ZN7G27x4y0C1Ev),
  NSPAIR(_ZN7G27x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y0[];
extern void _ZN3C273fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x4y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y0[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G27x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G27x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x4y0[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y0[] = {
  {&(_ZTV7G27x4y0[4]),  4,12},
  {&(_tg__ZTV5E27x4__7G27x4y0[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y0[3]),  3,4},
  {&(_ZTV7G27x4y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G27x4y0[];
extern  VTBL_ENTRY _ZTV7G27x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y0[];
static VTBL_ENTRY alt_thunk_names27[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C273fooEv,_ZThn28_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y0 = {  "G27x4y0", // class name
  bases_G27x4y0, 6,
  &(vtc_G27x4y0[0]), // expected_vtbl_contents
  &(vtt_G27x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names27,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y1  : virtual E27x4 , F1 {
  int ff;
  ~G27x4y1(); // tgen
  G27x4y1(); // tgen
};
//SIG(1 G27x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x4y1 ::~G27x4y1(){ note_dtor("G27x4y1", this);} // tgen
G27x4y1 ::G27x4y1(){ note_ctor("G27x4y1", this);} // tgen

static void Test_G27x4y1()
{
  extern Class_Descriptor cd_G27x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x4y1, buf);
    G27x4y1 *dp, &lv = *(dp=new (buf) G27x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y1)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(40,28), "G27x4y1");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(52,36), "G27x4y1");
    check_base_class_offset(lv, (C27*)(E27x4*), ABISELECT(16,12), "G27x4y1");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(28,20), "G27x4y1");
    check_base_class_offset(lv, (E27x4*), ABISELECT(16,12), "G27x4y1");
    check_base_class_offset(lv, (F1*), 0, "G27x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x4y1.ff");
    test_class_info(&lv, &cd_G27x4y1);
    dp->~G27x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y1(Test_G27x4y1, "G27x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x4y1C1Ev();
extern void _ZN7G27x4y1D1Ev();
Name_Map name_map_G27x4y1[] = {
  NSPAIR(_ZN7G27x4y1C1Ev),
  NSPAIR(_ZN7G27x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x4y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x4y1[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G27x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x4y1[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y1[] = {
  {&(_ZTV7G27x4y1[5]),  5,16},
  {&(_ZTV7G27x4y1[11]),  11,16},
  {&(_ZTV7G27x4y1[15]),  15,16},
  {&(_tg__ZTV5E27x4__7G27x4y1[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x4y1[];
extern  VTBL_ENTRY _ZTV7G27x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y1[];
static VTBL_ENTRY alt_thunk_names28[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y1 = {  "G27x4y1", // class name
  bases_G27x4y1, 6,
  &(vtc_G27x4y1[0]), // expected_vtbl_contents
  &(vtt_G27x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names28,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y2  : E27x4 , virtual F1 {
  int ff;
  ~G27x4y2(); // tgen
  G27x4y2(); // tgen
};
//SIG(1 G27x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x4y2 ::~G27x4y2(){ note_dtor("G27x4y2", this);} // tgen
G27x4y2 ::G27x4y2(){ note_ctor("G27x4y2", this);} // tgen

static void Test_G27x4y2()
{
  extern Class_Descriptor cd_G27x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x4y2, buf);
    G27x4y2 *dp, &lv = *(dp=new (buf) G27x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y2)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(24,20), "G27x4y2");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(36,28), "G27x4y2");
    check_base_class_offset(lv, (C27*)(E27x4*), 0, "G27x4y2");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(12,8), "G27x4y2");
    check_base_class_offset(lv, (E27x4*), 0, "G27x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G27x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x4y2.ff");
    test_class_info(&lv, &cd_G27x4y2);
    dp->~G27x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y2(Test_G27x4y2, "G27x4y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x4y2C1Ev();
extern void _ZN7G27x4y2D1Ev();
Name_Map name_map_G27x4y2[] = {
  NSPAIR(_ZN7G27x4y2C1Ev),
  NSPAIR(_ZN7G27x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y2[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x4y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y2[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G27x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G27x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x4y2[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y2[] = {
  {&(_ZTV7G27x4y2[5]),  5,14},
  {&(_tg__ZTV5E27x4__7G27x4y2[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y2[3]),  3,4},
  {&(_ZTV7G27x4y2[9]),  9,14},
  {&(_ZTV7G27x4y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G27x4y2[];
extern  VTBL_ENTRY _ZTV7G27x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y2[];
static VTBL_ENTRY alt_thunk_names29[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y2 = {  "G27x4y2", // class name
  bases_G27x4y2, 6,
  &(vtc_G27x4y2[0]), // expected_vtbl_contents
  &(vtt_G27x4y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names29,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y3  : virtual E27x4 , virtual F1 {
  int ff;
  ~G27x4y3(); // tgen
  G27x4y3(); // tgen
};
//SIG(1 G27x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x4y3 ::~G27x4y3(){ note_dtor("G27x4y3", this);} // tgen
G27x4y3 ::G27x4y3(){ note_ctor("G27x4y3", this);} // tgen

static void Test_G27x4y3()
{
  extern Class_Descriptor cd_G27x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x4y3, buf);
    G27x4y3 *dp, &lv = *(dp=new (buf) G27x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y3)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(40,24), "G27x4y3");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(52,32), "G27x4y3");
    check_base_class_offset(lv, (C27*)(E27x4*), ABISELECT(16,8), "G27x4y3");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(28,16), "G27x4y3");
    check_base_class_offset(lv, (E27x4*), ABISELECT(16,8), "G27x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x4y3.ff");
    test_class_info(&lv, &cd_G27x4y3);
    dp->~G27x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y3(Test_G27x4y3, "G27x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x4y3C1Ev();
extern void _ZN7G27x4y3D1Ev();
Name_Map name_map_G27x4y3[] = {
  NSPAIR(_ZN7G27x4y3C1Ev),
  NSPAIR(_ZN7G27x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y3[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x4y3[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G27x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G27x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x4y3[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y3[] = {
  {&(_ZTV7G27x4y3[6]),  6,20},
  {&(_ZTV7G27x4y3[11]),  11,20},
  {&(_ZTV7G27x4y3[15]),  15,20},
  {&(_ZTV7G27x4y3[19]),  19,20},
  {&(_tg__ZTV5E27x4__7G27x4y3[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x4y3[];
extern  VTBL_ENTRY _ZTV7G27x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y3[];
static VTBL_ENTRY alt_thunk_names30[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y3 = {  "G27x4y3", // class name
  bases_G27x4y3, 6,
  &(vtc_G27x4y3[0]), // expected_vtbl_contents
  &(vtt_G27x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names30,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y4  : E27x4 , F0 {
  int ff;
  ~G27x4y4(); // tgen
  G27x4y4(); // tgen
};
//SIG(1 G27x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G27x4y4 ::~G27x4y4(){ note_dtor("G27x4y4", this);} // tgen
G27x4y4 ::G27x4y4(){ note_ctor("G27x4y4", this);} // tgen

static void Test_G27x4y4()
{
  extern Class_Descriptor cd_G27x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x4y4, buf);
    G27x4y4 *dp, &lv = *(dp=new (buf) G27x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y4)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(32,24), "G27x4y4");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(44,32), "G27x4y4");
    check_base_class_offset(lv, (C27*)(E27x4*), 0, "G27x4y4");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(12,8), "G27x4y4");
    check_base_class_offset(lv, (E27x4*), 0, "G27x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G27x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G27x4y4.ff");
    test_class_info(&lv, &cd_G27x4y4);
    dp->~G27x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y4(Test_G27x4y4, "G27x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G27x4y4C1Ev();
extern void _ZN7G27x4y4D1Ev();
Name_Map name_map_G27x4y4[] = {
  NSPAIR(_ZN7G27x4y4C1Ev),
  NSPAIR(_ZN7G27x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y4[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x4y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x4y4[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y4[] = {
  {&(_ZTV7G27x4y4[4]),  4,9},
  {&(_tg__ZTV5E27x4__7G27x4y4[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y4[3]),  3,4},
  {&(_ZTV7G27x4y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G27x4y4[];
extern  VTBL_ENTRY _ZTV7G27x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y4[];
static VTBL_ENTRY alt_thunk_names31[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y4 = {  "G27x4y4", // class name
  bases_G27x4y4, 6,
  &(vtc_G27x4y4[0]), // expected_vtbl_contents
  &(vtt_G27x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G27x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names31,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y5  : virtual E27x4 , F0 {
  int ff;
  ~G27x4y5(); // tgen
  G27x4y5(); // tgen
};
//SIG(1 G27x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G27x4y5 ::~G27x4y5(){ note_dtor("G27x4y5", this);} // tgen
G27x4y5 ::G27x4y5(){ note_ctor("G27x4y5", this);} // tgen

static void Test_G27x4y5()
{
  extern Class_Descriptor cd_G27x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x4y5, buf);
    G27x4y5 *dp, &lv = *(dp=new (buf) G27x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y5)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(40,28), "G27x4y5");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(52,36), "G27x4y5");
    check_base_class_offset(lv, (C27*)(E27x4*), ABISELECT(16,12), "G27x4y5");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(28,20), "G27x4y5");
    check_base_class_offset(lv, (E27x4*), ABISELECT(16,12), "G27x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x4y5.ff");
    test_class_info(&lv, &cd_G27x4y5);
    dp->~G27x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y5(Test_G27x4y5, "G27x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x4y5C1Ev();
extern void _ZN7G27x4y5D1Ev();
Name_Map name_map_G27x4y5[] = {
  NSPAIR(_ZN7G27x4y5C1Ev),
  NSPAIR(_ZN7G27x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y5[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x4y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x4y5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G27x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x4y5[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y5[] = {
  {&(_ZTV7G27x4y5[5]),  5,15},
  {&(_ZTV7G27x4y5[10]),  10,15},
  {&(_ZTV7G27x4y5[14]),  14,15},
  {&(_tg__ZTV5E27x4__7G27x4y5[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x4y5[];
extern  VTBL_ENTRY _ZTV7G27x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y5[];
static VTBL_ENTRY alt_thunk_names32[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y5 = {  "G27x4y5", // class name
  bases_G27x4y5, 6,
  &(vtc_G27x4y5[0]), // expected_vtbl_contents
  &(vtt_G27x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names32,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y6  : E27x4 , virtual F0 {
  int ff;
  ~G27x4y6(); // tgen
  G27x4y6(); // tgen
};
//SIG(1 G27x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x4y6 ::~G27x4y6(){ note_dtor("G27x4y6", this);} // tgen
G27x4y6 ::G27x4y6(){ note_ctor("G27x4y6", this);} // tgen

static void Test_G27x4y6()
{
  extern Class_Descriptor cd_G27x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x4y6, buf);
    G27x4y6 *dp, &lv = *(dp=new (buf) G27x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y6)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(24,20), "G27x4y6");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(36,28), "G27x4y6");
    check_base_class_offset(lv, (C27*)(E27x4*), 0, "G27x4y6");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(12,8), "G27x4y6");
    check_base_class_offset(lv, (E27x4*), 0, "G27x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G27x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x4y6.ff");
    test_class_info(&lv, &cd_G27x4y6);
    dp->~G27x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y6(Test_G27x4y6, "G27x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G27x4y6C1Ev();
extern void _ZN7G27x4y6D1Ev();
Name_Map name_map_G27x4y6[] = {
  NSPAIR(_ZN7G27x4y6C1Ev),
  NSPAIR(_ZN7G27x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y6[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x4y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G27x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x4y6[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y6[] = {
  {&(_ZTV7G27x4y6[5]),  5,10},
  {&(_tg__ZTV5E27x4__7G27x4y6[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y6[3]),  3,4},
  {&(_ZTV7G27x4y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G27x4y6[];
extern  VTBL_ENTRY _ZTV7G27x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y6[];
static VTBL_ENTRY alt_thunk_names33[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y6 = {  "G27x4y6", // class name
  bases_G27x4y6, 6,
  &(vtc_G27x4y6[0]), // expected_vtbl_contents
  &(vtt_G27x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G27x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names33,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x4y7  : virtual E27x4 , virtual F0 {
  int ff;
  ~G27x4y7(); // tgen
  G27x4y7(); // tgen
};
//SIG(1 G27x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x4y7 ::~G27x4y7(){ note_dtor("G27x4y7", this);} // tgen
G27x4y7 ::G27x4y7(){ note_ctor("G27x4y7", this);} // tgen

static void Test_G27x4y7()
{
  extern Class_Descriptor cd_G27x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x4y7, buf);
    G27x4y7 *dp, &lv = *(dp=new (buf) G27x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x4y7)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x4*), ABISELECT(40,24), "G27x4y7");
    check_base_class_offset(lv, (B0*)(C27*)(E27x4*), ABISELECT(52,32), "G27x4y7");
    check_base_class_offset(lv, (C27*)(E27x4*), ABISELECT(16,8), "G27x4y7");
    check_base_class_offset(lv, (D0*)(E27x4*), ABISELECT(28,16), "G27x4y7");
    check_base_class_offset(lv, (E27x4*), ABISELECT(16,8), "G27x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G27x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x4y7.ff");
    test_class_info(&lv, &cd_G27x4y7);
    dp->~G27x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x4y7(Test_G27x4y7, "G27x4y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G27x4y7C1Ev();
extern void _ZN7G27x4y7D1Ev();
Name_Map name_map_G27x4y7[] = {
  NSPAIR(_ZN7G27x4y7C1Ev),
  NSPAIR(_ZN7G27x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x4;
extern VTBL_ENTRY _ZTI5E27x4[];
extern  VTBL_ENTRY _ZTV5E27x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x4y7[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x4y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x4y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x4y7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G27x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x4y7[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x4__7G27x4y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x4__7G27x4y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x4__7G27x4y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x4__7G27x4y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x4y7[] = {
  {&(_ZTV7G27x4y7[6]),  6,16},
  {&(_ZTV7G27x4y7[11]),  11,16},
  {&(_ZTV7G27x4y7[15]),  15,16},
  {&(_tg__ZTV5E27x4__7G27x4y7[4]),  4,5},
  {&(_tg__ZTV3C275E27x4__7G27x4y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x4__7G27x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x4__7G27x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x4y7[];
extern  VTBL_ENTRY _ZTV7G27x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x4y7[];
static VTBL_ENTRY alt_thunk_names34[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x4y7 = {  "G27x4y7", // class name
  bases_G27x4y7, 6,
  &(vtc_G27x4y7[0]), // expected_vtbl_contents
  &(vtt_G27x4y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G27x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x4y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names34,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x4  : C28 , D0 {
  int fd;
  ~E28x4(); // tgen
  E28x4(); // tgen
};
//SIG(-1 E28x4) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E28x4 ::~E28x4(){ note_dtor("E28x4", this);} // tgen
E28x4 ::E28x4(){ note_ctor("E28x4", this);} // tgen

static void Test_E28x4()
{
  extern Class_Descriptor cd_E28x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E28x4, buf);
    E28x4 *dp, &lv = *(dp=new (buf) E28x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E28x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x4)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(8,4), "E28x4");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(24,20), "E28x4");
    check_base_class_offset(lv, (C28*), 0, "E28x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E28x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E28x4.fd");
    test_class_info(&lv, &cd_E28x4);
    dp->~E28x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x4(Test_E28x4, "E28x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E28x4C1Ev();
extern void _ZN5E28x4D1Ev();
Name_Map name_map_E28x4[] = {
  NSPAIR(_ZN5E28x4C1Ev),
  NSPAIR(_ZN5E28x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E28x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E28x4[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV5E28x4[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__5E28x4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x4[] = {
  {&(_ZTV5E28x4[3]),  3,8},
  {&(_tg__ZTV3C28__5E28x4[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__5E28x4[3]),  3,4},
  {&(_ZTV5E28x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
static VTBL_ENTRY alt_thunk_names35[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x4 = {  "E28x4", // class name
  bases_E28x4, 4,
  &(vtc_E28x4[0]), // expected_vtbl_contents
  &(vtt_E28x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E28x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E28x4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E28x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names35,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y0  : E28x4 , F1 {
  int ff;
  ~G28x4y0(); // tgen
  G28x4y0(); // tgen
};
//SIG(1 G28x4y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x4y0 ::~G28x4y0(){ note_dtor("G28x4y0", this);} // tgen
G28x4y0 ::G28x4y0(){ note_ctor("G28x4y0", this);} // tgen

static void Test_G28x4y0()
{
  extern Class_Descriptor cd_G28x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x4y0, buf);
    G28x4y0 *dp, &lv = *(dp=new (buf) G28x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y0)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(8,4), "G28x4y0");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(40,32), "G28x4y0");
    check_base_class_offset(lv, (C28*)(E28x4*), 0, "G28x4y0");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(16,12), "G28x4y0");
    check_base_class_offset(lv, (E28x4*), 0, "G28x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G28x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G28x4y0.ff");
    test_class_info(&lv, &cd_G28x4y0);
    dp->~G28x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y0(Test_G28x4y0, "G28x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x4y0C1Ev();
extern void _ZN7G28x4y0D1Ev();
Name_Map name_map_G28x4y0[] = {
  NSPAIR(_ZN7G28x4y0C1Ev),
  NSPAIR(_ZN7G28x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y0[];
extern void _ZN3C283fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y0[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G28x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G28x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x4y0[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y0[] = {
  {&(_ZTV7G28x4y0[3]),  3,11},
  {&(_tg__ZTV5E28x4__7G28x4y0[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y0[3]),  3,4},
  {&(_ZTV7G28x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G28x4y0[];
extern  VTBL_ENTRY _ZTV7G28x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y0[];
static VTBL_ENTRY alt_thunk_names36[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn32_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y0 = {  "G28x4y0", // class name
  bases_G28x4y0, 6,
  &(vtc_G28x4y0[0]), // expected_vtbl_contents
  &(vtt_G28x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names36,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y1  : virtual E28x4 , F1 {
  int ff;
  ~G28x4y1(); // tgen
  G28x4y1(); // tgen
};
//SIG(1 G28x4y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x4y1 ::~G28x4y1(){ note_dtor("G28x4y1", this);} // tgen
G28x4y1 ::G28x4y1(){ note_ctor("G28x4y1", this);} // tgen

static void Test_G28x4y1()
{
  extern Class_Descriptor cd_G28x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x4y1, buf);
    G28x4y1 *dp, &lv = *(dp=new (buf) G28x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y1)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(24,16), "G28x4y1");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(40,32), "G28x4y1");
    check_base_class_offset(lv, (C28*)(E28x4*), ABISELECT(16,12), "G28x4y1");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(32,24), "G28x4y1");
    check_base_class_offset(lv, (E28x4*), ABISELECT(16,12), "G28x4y1");
    check_base_class_offset(lv, (F1*), 0, "G28x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x4y1.ff");
    test_class_info(&lv, &cd_G28x4y1);
    dp->~G28x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y1(Test_G28x4y1, "G28x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x4y1C1Ev();
extern void _ZN7G28x4y1D1Ev();
Name_Map name_map_G28x4y1[] = {
  NSPAIR(_ZN7G28x4y1C1Ev),
  NSPAIR(_ZN7G28x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x4y1[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G28x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x4y1[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y1[] = {
  {&(_ZTV7G28x4y1[4]),  4,14},
  {&(_ZTV7G28x4y1[9]),  9,14},
  {&(_ZTV7G28x4y1[13]),  13,14},
  {&(_tg__ZTV5E28x4__7G28x4y1[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x4y1[];
extern  VTBL_ENTRY _ZTV7G28x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y1[];
static VTBL_ENTRY alt_thunk_names37[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y1 = {  "G28x4y1", // class name
  bases_G28x4y1, 6,
  &(vtc_G28x4y1[0]), // expected_vtbl_contents
  &(vtt_G28x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names37,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y2  : E28x4 , virtual F1 {
  int ff;
  ~G28x4y2(); // tgen
  G28x4y2(); // tgen
};
//SIG(1 G28x4y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x4y2 ::~G28x4y2(){ note_dtor("G28x4y2", this);} // tgen
G28x4y2 ::G28x4y2(){ note_ctor("G28x4y2", this);} // tgen

static void Test_G28x4y2()
{
  extern Class_Descriptor cd_G28x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G28x4y2, buf);
    G28x4y2 *dp, &lv = *(dp=new (buf) G28x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G28x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y2)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(8,4), "G28x4y2");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(32,24), "G28x4y2");
    check_base_class_offset(lv, (C28*)(E28x4*), 0, "G28x4y2");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(16,12), "G28x4y2");
    check_base_class_offset(lv, (E28x4*), 0, "G28x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G28x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G28x4y2.ff");
    test_class_info(&lv, &cd_G28x4y2);
    dp->~G28x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y2(Test_G28x4y2, "G28x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G28x4y2C1Ev();
extern void _ZN7G28x4y2D1Ev();
Name_Map name_map_G28x4y2[] = {
  NSPAIR(_ZN7G28x4y2C1Ev),
  NSPAIR(_ZN7G28x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y2[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y2[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G28x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x4y2[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y2[] = {
  {&(_ZTV7G28x4y2[4]),  4,13},
  {&(_tg__ZTV5E28x4__7G28x4y2[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y2[3]),  3,4},
  {&(_ZTV7G28x4y2[8]),  8,13},
  {&(_ZTV7G28x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G28x4y2[];
extern  VTBL_ENTRY _ZTV7G28x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y2[];
static VTBL_ENTRY alt_thunk_names38[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y2 = {  "G28x4y2", // class name
  bases_G28x4y2, 6,
  &(vtc_G28x4y2[0]), // expected_vtbl_contents
  &(vtt_G28x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G28x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names38,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y3  : virtual E28x4 , virtual F1 {
  int ff;
  ~G28x4y3(); // tgen
  G28x4y3(); // tgen
};
//SIG(1 G28x4y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x4y3 ::~G28x4y3(){ note_dtor("G28x4y3", this);} // tgen
G28x4y3 ::G28x4y3(){ note_ctor("G28x4y3", this);} // tgen

static void Test_G28x4y3()
{
  extern Class_Descriptor cd_G28x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x4y3, buf);
    G28x4y3 *dp, &lv = *(dp=new (buf) G28x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y3)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(24,12), "G28x4y3");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(40,28), "G28x4y3");
    check_base_class_offset(lv, (C28*)(E28x4*), ABISELECT(16,8), "G28x4y3");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(32,20), "G28x4y3");
    check_base_class_offset(lv, (E28x4*), ABISELECT(16,8), "G28x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G28x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x4y3.ff");
    test_class_info(&lv, &cd_G28x4y3);
    dp->~G28x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y3(Test_G28x4y3, "G28x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G28x4y3C1Ev();
extern void _ZN7G28x4y3D1Ev();
Name_Map name_map_G28x4y3[] = {
  NSPAIR(_ZN7G28x4y3C1Ev),
  NSPAIR(_ZN7G28x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y3[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x4y3[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G28x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x4y3[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y3[] = {
  {&(_ZTV7G28x4y3[5]),  5,18},
  {&(_ZTV7G28x4y3[9]),  9,18},
  {&(_ZTV7G28x4y3[13]),  13,18},
  {&(_ZTV7G28x4y3[17]),  17,18},
  {&(_tg__ZTV5E28x4__7G28x4y3[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x4y3[];
extern  VTBL_ENTRY _ZTV7G28x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y3[];
static VTBL_ENTRY alt_thunk_names39[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y3 = {  "G28x4y3", // class name
  bases_G28x4y3, 6,
  &(vtc_G28x4y3[0]), // expected_vtbl_contents
  &(vtt_G28x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G28x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names39,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y4  : E28x4 , F0 {
  int ff;
  ~G28x4y4(); // tgen
  G28x4y4(); // tgen
};
//SIG(1 G28x4y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G28x4y4 ::~G28x4y4(){ note_dtor("G28x4y4", this);} // tgen
G28x4y4 ::G28x4y4(){ note_ctor("G28x4y4", this);} // tgen

static void Test_G28x4y4()
{
  extern Class_Descriptor cd_G28x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x4y4, buf);
    G28x4y4 *dp, &lv = *(dp=new (buf) G28x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y4)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(8,4), "G28x4y4");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(32,28), "G28x4y4");
    check_base_class_offset(lv, (C28*)(E28x4*), 0, "G28x4y4");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(16,12), "G28x4y4");
    check_base_class_offset(lv, (E28x4*), 0, "G28x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G28x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G28x4y4.ff");
    test_class_info(&lv, &cd_G28x4y4);
    dp->~G28x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y4(Test_G28x4y4, "G28x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G28x4y4C1Ev();
extern void _ZN7G28x4y4D1Ev();
Name_Map name_map_G28x4y4[] = {
  NSPAIR(_ZN7G28x4y4C1Ev),
  NSPAIR(_ZN7G28x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y4[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G28x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x4y4[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y4[] = {
  {&(_ZTV7G28x4y4[3]),  3,8},
  {&(_tg__ZTV5E28x4__7G28x4y4[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y4[3]),  3,4},
  {&(_ZTV7G28x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G28x4y4[];
extern  VTBL_ENTRY _ZTV7G28x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y4[];
static VTBL_ENTRY alt_thunk_names40[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn28_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y4 = {  "G28x4y4", // class name
  bases_G28x4y4, 6,
  &(vtc_G28x4y4[0]), // expected_vtbl_contents
  &(vtt_G28x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G28x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names40,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y5  : virtual E28x4 , F0 {
  int ff;
  ~G28x4y5(); // tgen
  G28x4y5(); // tgen
};
//SIG(1 G28x4y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G28x4y5 ::~G28x4y5(){ note_dtor("G28x4y5", this);} // tgen
G28x4y5 ::G28x4y5(){ note_ctor("G28x4y5", this);} // tgen

static void Test_G28x4y5()
{
  extern Class_Descriptor cd_G28x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x4y5, buf);
    G28x4y5 *dp, &lv = *(dp=new (buf) G28x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y5)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(24,16), "G28x4y5");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(40,32), "G28x4y5");
    check_base_class_offset(lv, (C28*)(E28x4*), ABISELECT(16,12), "G28x4y5");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(32,24), "G28x4y5");
    check_base_class_offset(lv, (E28x4*), ABISELECT(16,12), "G28x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x4y5.ff");
    test_class_info(&lv, &cd_G28x4y5);
    dp->~G28x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y5(Test_G28x4y5, "G28x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x4y5C1Ev();
extern void _ZN7G28x4y5D1Ev();
Name_Map name_map_G28x4y5[] = {
  NSPAIR(_ZN7G28x4y5C1Ev),
  NSPAIR(_ZN7G28x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y5[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x4y5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G28x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x4y5[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y5[] = {
  {&(_ZTV7G28x4y5[4]),  4,13},
  {&(_ZTV7G28x4y5[8]),  8,13},
  {&(_ZTV7G28x4y5[12]),  12,13},
  {&(_tg__ZTV5E28x4__7G28x4y5[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x4y5[];
extern  VTBL_ENTRY _ZTV7G28x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y5[];
static VTBL_ENTRY alt_thunk_names41[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y5 = {  "G28x4y5", // class name
  bases_G28x4y5, 6,
  &(vtc_G28x4y5[0]), // expected_vtbl_contents
  &(vtt_G28x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names41,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y6  : E28x4 , virtual F0 {
  int ff;
  ~G28x4y6(); // tgen
  G28x4y6(); // tgen
};
//SIG(1 G28x4y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x4y6 ::~G28x4y6(){ note_dtor("G28x4y6", this);} // tgen
G28x4y6 ::G28x4y6(){ note_ctor("G28x4y6", this);} // tgen

static void Test_G28x4y6()
{
  extern Class_Descriptor cd_G28x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x4y6, buf);
    G28x4y6 *dp, &lv = *(dp=new (buf) G28x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y6)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(8,4), "G28x4y6");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(32,24), "G28x4y6");
    check_base_class_offset(lv, (C28*)(E28x4*), 0, "G28x4y6");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(16,12), "G28x4y6");
    check_base_class_offset(lv, (E28x4*), 0, "G28x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G28x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G28x4y6.ff");
    test_class_info(&lv, &cd_G28x4y6);
    dp->~G28x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y6(Test_G28x4y6, "G28x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G28x4y6C1Ev();
extern void _ZN7G28x4y6D1Ev();
Name_Map name_map_G28x4y6[] = {
  NSPAIR(_ZN7G28x4y6C1Ev),
  NSPAIR(_ZN7G28x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y6[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x4y6[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y6[] = {
  {&(_ZTV7G28x4y6[4]),  4,9},
  {&(_tg__ZTV5E28x4__7G28x4y6[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y6[3]),  3,4},
  {&(_ZTV7G28x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G28x4y6[];
extern  VTBL_ENTRY _ZTV7G28x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y6[];
static VTBL_ENTRY alt_thunk_names42[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y6 = {  "G28x4y6", // class name
  bases_G28x4y6, 6,
  &(vtc_G28x4y6[0]), // expected_vtbl_contents
  &(vtt_G28x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G28x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names42,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x4y7  : virtual E28x4 , virtual F0 {
  int ff;
  ~G28x4y7(); // tgen
  G28x4y7(); // tgen
};
//SIG(1 G28x4y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x4y7 ::~G28x4y7(){ note_dtor("G28x4y7", this);} // tgen
G28x4y7 ::G28x4y7(){ note_ctor("G28x4y7", this);} // tgen

static void Test_G28x4y7()
{
  extern Class_Descriptor cd_G28x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x4y7, buf);
    G28x4y7 *dp, &lv = *(dp=new (buf) G28x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x4y7)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x4*), ABISELECT(24,12), "G28x4y7");
    check_base_class_offset(lv, (B1*)(C28*)(E28x4*), ABISELECT(40,28), "G28x4y7");
    check_base_class_offset(lv, (C28*)(E28x4*), ABISELECT(16,8), "G28x4y7");
    check_base_class_offset(lv, (D0*)(E28x4*), ABISELECT(32,20), "G28x4y7");
    check_base_class_offset(lv, (E28x4*), ABISELECT(16,8), "G28x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G28x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x4y7.ff");
    test_class_info(&lv, &cd_G28x4y7);
    dp->~G28x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x4y7(Test_G28x4y7, "G28x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x4y7C1Ev();
extern void _ZN7G28x4y7D1Ev();
Name_Map name_map_G28x4y7[] = {
  NSPAIR(_ZN7G28x4y7C1Ev),
  NSPAIR(_ZN7G28x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x4;
extern VTBL_ENTRY _ZTI5E28x4[];
extern  VTBL_ENTRY _ZTV5E28x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x4y7[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x4y7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x4y7[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x4__7G28x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x4__7G28x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x4__7G28x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x4__7G28x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x4y7[] = {
  {&(_ZTV7G28x4y7[5]),  5,14},
  {&(_ZTV7G28x4y7[9]),  9,14},
  {&(_ZTV7G28x4y7[13]),  13,14},
  {&(_tg__ZTV5E28x4__7G28x4y7[3]),  3,4},
  {&(_tg__ZTV3C285E28x4__7G28x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x4__7G28x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x4__7G28x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x4y7[];
extern  VTBL_ENTRY _ZTV7G28x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x4y7[];
static VTBL_ENTRY alt_thunk_names43[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x4y7 = {  "G28x4y7", // class name
  bases_G28x4y7, 6,
  &(vtc_G28x4y7[0]), // expected_vtbl_contents
  &(vtt_G28x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x4y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names43,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x4  : C29 , D0 {
  int fd;
  ~E29x4(); // tgen
  E29x4(); // tgen
};
//SIG(-1 E29x4) C1{ BC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E29x4 ::~E29x4(){ note_dtor("E29x4", this);} // tgen
E29x4 ::E29x4(){ note_ctor("E29x4", this);} // tgen

static void Test_E29x4()
{
  extern Class_Descriptor cd_E29x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E29x4, buf);
    E29x4 *dp, &lv = *(dp=new (buf) E29x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E29x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x4)");
    check_base_class_offset(lv, (A1*)(C29*), 0, "E29x4");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(24,20), "E29x4");
    check_base_class_offset(lv, (C29*), 0, "E29x4");
    check_base_class_offset(lv, (D0*), ABISELECT(16,12), "E29x4");
    check_field_offset(lv, fd, ABISELECT(20,16), "E29x4.fd");
    test_class_info(&lv, &cd_E29x4);
    dp->~E29x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x4(Test_E29x4, "E29x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E29x4C1Ev();
extern void _ZN5E29x4D1Ev();
Name_Map name_map_E29x4[] = {
  NSPAIR(_ZN5E29x4C1Ev),
  NSPAIR(_ZN5E29x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E29x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E29x4[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV5E29x4[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__5E29x4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x4[] = {
  {&(_ZTV5E29x4[3]),  3,8},
  {&(_tg__ZTV3C29__5E29x4[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__5E29x4[3]),  3,4},
  {&(_ZTV5E29x4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
static VTBL_ENTRY alt_thunk_names44[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x4 = {  "E29x4", // class name
  bases_E29x4, 4,
  &(vtc_E29x4[0]), // expected_vtbl_contents
  &(vtt_E29x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E29x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E29x4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E29x4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names44,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y0  : E29x4 , F1 {
  int ff;
  ~G29x4y0(); // tgen
  G29x4y0(); // tgen
};
//SIG(1 G29x4y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x4y0 ::~G29x4y0(){ note_dtor("G29x4y0", this);} // tgen
G29x4y0 ::G29x4y0(){ note_ctor("G29x4y0", this);} // tgen

static void Test_G29x4y0()
{
  extern Class_Descriptor cd_G29x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x4y0, buf);
    G29x4y0 *dp, &lv = *(dp=new (buf) G29x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y0)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), 0, "G29x4y0");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(40,32), "G29x4y0");
    check_base_class_offset(lv, (C29*)(E29x4*), 0, "G29x4y0");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(16,12), "G29x4y0");
    check_base_class_offset(lv, (E29x4*), 0, "G29x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G29x4y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G29x4y0.ff");
    test_class_info(&lv, &cd_G29x4y0);
    dp->~G29x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y0(Test_G29x4y0, "G29x4y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x4y0C1Ev();
extern void _ZN7G29x4y0D1Ev();
Name_Map name_map_G29x4y0[] = {
  NSPAIR(_ZN7G29x4y0C1Ev),
  NSPAIR(_ZN7G29x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y0[];
extern void _ZN3C293fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y0[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G29x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G29x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x4y0[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y0[] = {
  ABISELECT(-40,-32),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y0[] = {
  {&(_ZTV7G29x4y0[3]),  3,11},
  {&(_tg__ZTV5E29x4__7G29x4y0[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y0[3]),  3,4},
  {&(_ZTV7G29x4y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G29x4y0[];
extern  VTBL_ENTRY _ZTV7G29x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y0[];
static VTBL_ENTRY alt_thunk_names45[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn32_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y0 = {  "G29x4y0", // class name
  bases_G29x4y0, 6,
  &(vtc_G29x4y0[0]), // expected_vtbl_contents
  &(vtt_G29x4y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y0),11, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names45,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y1  : virtual E29x4 , F1 {
  int ff;
  ~G29x4y1(); // tgen
  G29x4y1(); // tgen
};
//SIG(1 G29x4y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x4y1 ::~G29x4y1(){ note_dtor("G29x4y1", this);} // tgen
G29x4y1 ::G29x4y1(){ note_ctor("G29x4y1", this);} // tgen

static void Test_G29x4y1()
{
  extern Class_Descriptor cd_G29x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x4y1, buf);
    G29x4y1 *dp, &lv = *(dp=new (buf) G29x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y1)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), ABISELECT(16,12), "G29x4y1");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(40,32), "G29x4y1");
    check_base_class_offset(lv, (C29*)(E29x4*), ABISELECT(16,12), "G29x4y1");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(32,24), "G29x4y1");
    check_base_class_offset(lv, (E29x4*), ABISELECT(16,12), "G29x4y1");
    check_base_class_offset(lv, (F1*), 0, "G29x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x4y1.ff");
    test_class_info(&lv, &cd_G29x4y1);
    dp->~G29x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y1(Test_G29x4y1, "G29x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x4y1C1Ev();
extern void _ZN7G29x4y1D1Ev();
Name_Map name_map_G29x4y1[] = {
  NSPAIR(_ZN7G29x4y1C1Ev),
  NSPAIR(_ZN7G29x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x4y1[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G29x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x4y1[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y1[] = {
  {&(_ZTV7G29x4y1[4]),  4,14},
  {&(_ZTV7G29x4y1[9]),  9,14},
  {&(_ZTV7G29x4y1[13]),  13,14},
  {&(_tg__ZTV5E29x4__7G29x4y1[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x4y1[];
extern  VTBL_ENTRY _ZTV7G29x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y1[];
static VTBL_ENTRY alt_thunk_names46[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y1 = {  "G29x4y1", // class name
  bases_G29x4y1, 6,
  &(vtc_G29x4y1[0]), // expected_vtbl_contents
  &(vtt_G29x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y1),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names46,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y2  : E29x4 , virtual F1 {
  int ff;
  ~G29x4y2(); // tgen
  G29x4y2(); // tgen
};
//SIG(1 G29x4y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x4y2 ::~G29x4y2(){ note_dtor("G29x4y2", this);} // tgen
G29x4y2 ::G29x4y2(){ note_ctor("G29x4y2", this);} // tgen

static void Test_G29x4y2()
{
  extern Class_Descriptor cd_G29x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G29x4y2, buf);
    G29x4y2 *dp, &lv = *(dp=new (buf) G29x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G29x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y2)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), 0, "G29x4y2");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(32,24), "G29x4y2");
    check_base_class_offset(lv, (C29*)(E29x4*), 0, "G29x4y2");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(16,12), "G29x4y2");
    check_base_class_offset(lv, (E29x4*), 0, "G29x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G29x4y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G29x4y2.ff");
    test_class_info(&lv, &cd_G29x4y2);
    dp->~G29x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y2(Test_G29x4y2, "G29x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G29x4y2C1Ev();
extern void _ZN7G29x4y2D1Ev();
Name_Map name_map_G29x4y2[] = {
  NSPAIR(_ZN7G29x4y2C1Ev),
  NSPAIR(_ZN7G29x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y2[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y2[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G29x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x4y2[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y2[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y2[] = {
  {&(_ZTV7G29x4y2[4]),  4,13},
  {&(_tg__ZTV5E29x4__7G29x4y2[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y2[3]),  3,4},
  {&(_ZTV7G29x4y2[8]),  8,13},
  {&(_ZTV7G29x4y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G29x4y2[];
extern  VTBL_ENTRY _ZTV7G29x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y2[];
static VTBL_ENTRY alt_thunk_names47[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y2 = {  "G29x4y2", // class name
  bases_G29x4y2, 6,
  &(vtc_G29x4y2[0]), // expected_vtbl_contents
  &(vtt_G29x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G29x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y2),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names47,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y3  : virtual E29x4 , virtual F1 {
  int ff;
  ~G29x4y3(); // tgen
  G29x4y3(); // tgen
};
//SIG(1 G29x4y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x4y3 ::~G29x4y3(){ note_dtor("G29x4y3", this);} // tgen
G29x4y3 ::G29x4y3(){ note_ctor("G29x4y3", this);} // tgen

static void Test_G29x4y3()
{
  extern Class_Descriptor cd_G29x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x4y3, buf);
    G29x4y3 *dp, &lv = *(dp=new (buf) G29x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y3)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), ABISELECT(16,8), "G29x4y3");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(40,28), "G29x4y3");
    check_base_class_offset(lv, (C29*)(E29x4*), ABISELECT(16,8), "G29x4y3");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(32,20), "G29x4y3");
    check_base_class_offset(lv, (E29x4*), ABISELECT(16,8), "G29x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G29x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x4y3.ff");
    test_class_info(&lv, &cd_G29x4y3);
    dp->~G29x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y3(Test_G29x4y3, "G29x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G29x4y3C1Ev();
extern void _ZN7G29x4y3D1Ev();
Name_Map name_map_G29x4y3[] = {
  NSPAIR(_ZN7G29x4y3C1Ev),
  NSPAIR(_ZN7G29x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y3[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x4y3[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G29x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x4y3[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y3[] = {
  {&(_ZTV7G29x4y3[5]),  5,18},
  {&(_ZTV7G29x4y3[9]),  9,18},
  {&(_ZTV7G29x4y3[13]),  13,18},
  {&(_ZTV7G29x4y3[17]),  17,18},
  {&(_tg__ZTV5E29x4__7G29x4y3[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x4y3[];
extern  VTBL_ENTRY _ZTV7G29x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y3[];
static VTBL_ENTRY alt_thunk_names48[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y3 = {  "G29x4y3", // class name
  bases_G29x4y3, 6,
  &(vtc_G29x4y3[0]), // expected_vtbl_contents
  &(vtt_G29x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G29x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y3),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names48,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y4  : E29x4 , F0 {
  int ff;
  ~G29x4y4(); // tgen
  G29x4y4(); // tgen
};
//SIG(1 G29x4y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G29x4y4 ::~G29x4y4(){ note_dtor("G29x4y4", this);} // tgen
G29x4y4 ::G29x4y4(){ note_ctor("G29x4y4", this);} // tgen

static void Test_G29x4y4()
{
  extern Class_Descriptor cd_G29x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x4y4, buf);
    G29x4y4 *dp, &lv = *(dp=new (buf) G29x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y4)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), 0, "G29x4y4");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(32,28), "G29x4y4");
    check_base_class_offset(lv, (C29*)(E29x4*), 0, "G29x4y4");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(16,12), "G29x4y4");
    check_base_class_offset(lv, (E29x4*), 0, "G29x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G29x4y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G29x4y4.ff");
    test_class_info(&lv, &cd_G29x4y4);
    dp->~G29x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y4(Test_G29x4y4, "G29x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G29x4y4C1Ev();
extern void _ZN7G29x4y4D1Ev();
Name_Map name_map_G29x4y4[] = {
  NSPAIR(_ZN7G29x4y4C1Ev),
  NSPAIR(_ZN7G29x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y4[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G29x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x4y4[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y4[] = {
  {&(_ZTV7G29x4y4[3]),  3,8},
  {&(_tg__ZTV5E29x4__7G29x4y4[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y4[3]),  3,4},
  {&(_ZTV7G29x4y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G29x4y4[];
extern  VTBL_ENTRY _ZTV7G29x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y4[];
static VTBL_ENTRY alt_thunk_names49[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn28_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y4 = {  "G29x4y4", // class name
  bases_G29x4y4, 6,
  &(vtc_G29x4y4[0]), // expected_vtbl_contents
  &(vtt_G29x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G29x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y4),8, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names49,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y5  : virtual E29x4 , F0 {
  int ff;
  ~G29x4y5(); // tgen
  G29x4y5(); // tgen
};
//SIG(1 G29x4y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G29x4y5 ::~G29x4y5(){ note_dtor("G29x4y5", this);} // tgen
G29x4y5 ::G29x4y5(){ note_ctor("G29x4y5", this);} // tgen

static void Test_G29x4y5()
{
  extern Class_Descriptor cd_G29x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x4y5, buf);
    G29x4y5 *dp, &lv = *(dp=new (buf) G29x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y5)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), ABISELECT(16,12), "G29x4y5");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(40,32), "G29x4y5");
    check_base_class_offset(lv, (C29*)(E29x4*), ABISELECT(16,12), "G29x4y5");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(32,24), "G29x4y5");
    check_base_class_offset(lv, (E29x4*), ABISELECT(16,12), "G29x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x4y5.ff");
    test_class_info(&lv, &cd_G29x4y5);
    dp->~G29x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y5(Test_G29x4y5, "G29x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x4y5C1Ev();
extern void _ZN7G29x4y5D1Ev();
Name_Map name_map_G29x4y5[] = {
  NSPAIR(_ZN7G29x4y5C1Ev),
  NSPAIR(_ZN7G29x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y5[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x4y5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G29x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x4y5[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y5[] = {
  {&(_ZTV7G29x4y5[4]),  4,13},
  {&(_ZTV7G29x4y5[8]),  8,13},
  {&(_ZTV7G29x4y5[12]),  12,13},
  {&(_tg__ZTV5E29x4__7G29x4y5[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x4y5[];
extern  VTBL_ENTRY _ZTV7G29x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y5[];
static VTBL_ENTRY alt_thunk_names50[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y5 = {  "G29x4y5", // class name
  bases_G29x4y5, 6,
  &(vtc_G29x4y5[0]), // expected_vtbl_contents
  &(vtt_G29x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names50,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y6  : E29x4 , virtual F0 {
  int ff;
  ~G29x4y6(); // tgen
  G29x4y6(); // tgen
};
//SIG(1 G29x4y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x4y6 ::~G29x4y6(){ note_dtor("G29x4y6", this);} // tgen
G29x4y6 ::G29x4y6(){ note_ctor("G29x4y6", this);} // tgen

static void Test_G29x4y6()
{
  extern Class_Descriptor cd_G29x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x4y6, buf);
    G29x4y6 *dp, &lv = *(dp=new (buf) G29x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y6)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), 0, "G29x4y6");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(32,24), "G29x4y6");
    check_base_class_offset(lv, (C29*)(E29x4*), 0, "G29x4y6");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(16,12), "G29x4y6");
    check_base_class_offset(lv, (E29x4*), 0, "G29x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G29x4y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G29x4y6.ff");
    test_class_info(&lv, &cd_G29x4y6);
    dp->~G29x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y6(Test_G29x4y6, "G29x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G29x4y6C1Ev();
extern void _ZN7G29x4y6D1Ev();
Name_Map name_map_G29x4y6[] = {
  NSPAIR(_ZN7G29x4y6C1Ev),
  NSPAIR(_ZN7G29x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y6[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x4y6[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y6[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y6[] = {
  {&(_ZTV7G29x4y6[4]),  4,9},
  {&(_tg__ZTV5E29x4__7G29x4y6[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y6[3]),  3,4},
  {&(_ZTV7G29x4y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G29x4y6[];
extern  VTBL_ENTRY _ZTV7G29x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y6[];
static VTBL_ENTRY alt_thunk_names51[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y6 = {  "G29x4y6", // class name
  bases_G29x4y6, 6,
  &(vtc_G29x4y6[0]), // expected_vtbl_contents
  &(vtt_G29x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G29x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names51,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x4y7  : virtual E29x4 , virtual F0 {
  int ff;
  ~G29x4y7(); // tgen
  G29x4y7(); // tgen
};
//SIG(1 G29x4y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x4y7 ::~G29x4y7(){ note_dtor("G29x4y7", this);} // tgen
G29x4y7 ::G29x4y7(){ note_ctor("G29x4y7", this);} // tgen

static void Test_G29x4y7()
{
  extern Class_Descriptor cd_G29x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x4y7, buf);
    G29x4y7 *dp, &lv = *(dp=new (buf) G29x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x4y7)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x4*), ABISELECT(16,8), "G29x4y7");
    check_base_class_offset(lv, (B1*)(C29*)(E29x4*), ABISELECT(40,28), "G29x4y7");
    check_base_class_offset(lv, (C29*)(E29x4*), ABISELECT(16,8), "G29x4y7");
    check_base_class_offset(lv, (D0*)(E29x4*), ABISELECT(32,20), "G29x4y7");
    check_base_class_offset(lv, (E29x4*), ABISELECT(16,8), "G29x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G29x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x4y7.ff");
    test_class_info(&lv, &cd_G29x4y7);
    dp->~G29x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x4y7(Test_G29x4y7, "G29x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x4y7C1Ev();
extern void _ZN7G29x4y7D1Ev();
Name_Map name_map_G29x4y7[] = {
  NSPAIR(_ZN7G29x4y7C1Ev),
  NSPAIR(_ZN7G29x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x4;
extern VTBL_ENTRY _ZTI5E29x4[];
extern  VTBL_ENTRY _ZTV5E29x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x4,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x4y7[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x4y7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x4y7[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x4__7G29x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x4__7G29x4y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x4__7G29x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x4__7G29x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x4y7[] = {
  {&(_ZTV7G29x4y7[5]),  5,14},
  {&(_ZTV7G29x4y7[9]),  9,14},
  {&(_ZTV7G29x4y7[13]),  13,14},
  {&(_tg__ZTV5E29x4__7G29x4y7[3]),  3,4},
  {&(_tg__ZTV3C295E29x4__7G29x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x4__7G29x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x4__7G29x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x4y7[];
extern  VTBL_ENTRY _ZTV7G29x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x4y7[];
static VTBL_ENTRY alt_thunk_names52[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x4y7 = {  "G29x4y7", // class name
  bases_G29x4y7, 6,
  &(vtc_G29x4y7[0]), // expected_vtbl_contents
  &(vtt_G29x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x4y7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x4y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names52,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x4  : C30 , D0 {
  int fd;
  ~E30x4(); // tgen
  E30x4(); // tgen
};
//SIG(-1 E30x4) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E30x4 ::~E30x4(){ note_dtor("E30x4", this);} // tgen
E30x4 ::E30x4(){ note_ctor("E30x4", this);} // tgen

static void Test_E30x4()
{
  extern Class_Descriptor cd_E30x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E30x4, buf);
    E30x4 *dp, &lv = *(dp=new (buf) E30x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E30x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x4)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(20,16), "E30x4");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(24,20), "E30x4");
    check_base_class_offset(lv, (C30*), 0, "E30x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E30x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E30x4.fd");
    test_class_info(&lv, &cd_E30x4);
    dp->~E30x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x4(Test_E30x4, "E30x4", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E30x4C1Ev();
extern void _ZN5E30x4D1Ev();
Name_Map name_map_E30x4[] = {
  NSPAIR(_ZN5E30x4C1Ev),
  NSPAIR(_ZN5E30x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E30x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E30x4[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV5E30x4[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x4[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__5E30x4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x4[] = {
  {&(_ZTV5E30x4[4]),  4,9},
  {&(_tg__ZTV3C30__5E30x4[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__5E30x4[3]),  3,4},
  {&(_ZTV5E30x4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
static VTBL_ENTRY alt_thunk_names53[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x4 = {  "E30x4", // class name
  bases_E30x4, 4,
  &(vtc_E30x4[0]), // expected_vtbl_contents
  &(vtt_E30x4[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E30x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E30x4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E30x4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names53,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y0  : E30x4 , F1 {
  int ff;
  ~G30x4y0(); // tgen
  G30x4y0(); // tgen
};
//SIG(1 G30x4y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x4y0 ::~G30x4y0(){ note_dtor("G30x4y0", this);} // tgen
G30x4y0 ::G30x4y0(){ note_ctor("G30x4y0", this);} // tgen

static void Test_G30x4y0()
{
  extern Class_Descriptor cd_G30x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G30x4y0, buf);
    G30x4y0 *dp, &lv = *(dp=new (buf) G30x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G30x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y0)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(40,28), "G30x4y0");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(48,32), "G30x4y0");
    check_base_class_offset(lv, (C30*)(E30x4*), 0, "G30x4y0");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(12,8), "G30x4y0");
    check_base_class_offset(lv, (E30x4*), 0, "G30x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G30x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G30x4y0.ff");
    test_class_info(&lv, &cd_G30x4y0);
    dp->~G30x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y0(Test_G30x4y0, "G30x4y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G30x4y0C1Ev();
extern void _ZN7G30x4y0D1Ev();
Name_Map name_map_G30x4y0[] = {
  NSPAIR(_ZN7G30x4y0C1Ev),
  NSPAIR(_ZN7G30x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y0[];
extern void _ZN3C303fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x4y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y0[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G30x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x4y0[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y0[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y0[] = {
  {&(_ZTV7G30x4y0[4]),  4,12},
  {&(_tg__ZTV5E30x4__7G30x4y0[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y0[3]),  3,4},
  {&(_ZTV7G30x4y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G30x4y0[];
extern  VTBL_ENTRY _ZTV7G30x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y0[];
static VTBL_ENTRY alt_thunk_names54[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C303fooEv,_ZThn32_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y0 = {  "G30x4y0", // class name
  bases_G30x4y0, 6,
  &(vtc_G30x4y0[0]), // expected_vtbl_contents
  &(vtt_G30x4y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G30x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names54,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y1  : virtual E30x4 , F1 {
  int ff;
  ~G30x4y1(); // tgen
  G30x4y1(); // tgen
};
//SIG(1 G30x4y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x4y1 ::~G30x4y1(){ note_dtor("G30x4y1", this);} // tgen
G30x4y1 ::G30x4y1(){ note_ctor("G30x4y1", this);} // tgen

static void Test_G30x4y1()
{
  extern Class_Descriptor cd_G30x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x4y1, buf);
    G30x4y1 *dp, &lv = *(dp=new (buf) G30x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y1)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(36,28), "G30x4y1");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(40,32), "G30x4y1");
    check_base_class_offset(lv, (C30*)(E30x4*), ABISELECT(16,12), "G30x4y1");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(28,20), "G30x4y1");
    check_base_class_offset(lv, (E30x4*), ABISELECT(16,12), "G30x4y1");
    check_base_class_offset(lv, (F1*), 0, "G30x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x4y1.ff");
    test_class_info(&lv, &cd_G30x4y1);
    dp->~G30x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y1(Test_G30x4y1, "G30x4y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x4y1C1Ev();
extern void _ZN7G30x4y1D1Ev();
Name_Map name_map_G30x4y1[] = {
  NSPAIR(_ZN7G30x4y1C1Ev),
  NSPAIR(_ZN7G30x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x4y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x4y1[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G30x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x4y1[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y1[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y1[] = {
  {&(_ZTV7G30x4y1[5]),  5,16},
  {&(_ZTV7G30x4y1[11]),  11,16},
  {&(_ZTV7G30x4y1[15]),  15,16},
  {&(_tg__ZTV5E30x4__7G30x4y1[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x4y1[];
extern  VTBL_ENTRY _ZTV7G30x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y1[];
static VTBL_ENTRY alt_thunk_names55[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y1 = {  "G30x4y1", // class name
  bases_G30x4y1, 6,
  &(vtc_G30x4y1[0]), // expected_vtbl_contents
  &(vtt_G30x4y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names55,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y2  : E30x4 , virtual F1 {
  int ff;
  ~G30x4y2(); // tgen
  G30x4y2(); // tgen
};
//SIG(1 G30x4y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x4y2 ::~G30x4y2(){ note_dtor("G30x4y2", this);} // tgen
G30x4y2 ::G30x4y2(){ note_ctor("G30x4y2", this);} // tgen

static void Test_G30x4y2()
{
  extern Class_Descriptor cd_G30x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G30x4y2, buf);
    G30x4y2 *dp, &lv = *(dp=new (buf) G30x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G30x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y2)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(24,20), "G30x4y2");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(32,24), "G30x4y2");
    check_base_class_offset(lv, (C30*)(E30x4*), 0, "G30x4y2");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(12,8), "G30x4y2");
    check_base_class_offset(lv, (E30x4*), 0, "G30x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G30x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x4y2.ff");
    test_class_info(&lv, &cd_G30x4y2);
    dp->~G30x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y2(Test_G30x4y2, "G30x4y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G30x4y2C1Ev();
extern void _ZN7G30x4y2D1Ev();
Name_Map name_map_G30x4y2[] = {
  NSPAIR(_ZN7G30x4y2C1Ev),
  NSPAIR(_ZN7G30x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y2[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x4y2[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y2[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x4y2[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y2[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y2[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y2[] = {
  {&(_ZTV7G30x4y2[5]),  5,14},
  {&(_tg__ZTV5E30x4__7G30x4y2[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y2[3]),  3,4},
  {&(_ZTV7G30x4y2[9]),  9,14},
  {&(_ZTV7G30x4y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G30x4y2[];
extern  VTBL_ENTRY _ZTV7G30x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y2[];
static VTBL_ENTRY alt_thunk_names56[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y2 = {  "G30x4y2", // class name
  bases_G30x4y2, 6,
  &(vtc_G30x4y2[0]), // expected_vtbl_contents
  &(vtt_G30x4y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G30x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names56,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y3  : virtual E30x4 , virtual F1 {
  int ff;
  ~G30x4y3(); // tgen
  G30x4y3(); // tgen
};
//SIG(1 G30x4y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x4y3 ::~G30x4y3(){ note_dtor("G30x4y3", this);} // tgen
G30x4y3 ::G30x4y3(){ note_ctor("G30x4y3", this);} // tgen

static void Test_G30x4y3()
{
  extern Class_Descriptor cd_G30x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x4y3, buf);
    G30x4y3 *dp, &lv = *(dp=new (buf) G30x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y3)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(36,24), "G30x4y3");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(40,28), "G30x4y3");
    check_base_class_offset(lv, (C30*)(E30x4*), ABISELECT(16,8), "G30x4y3");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(28,16), "G30x4y3");
    check_base_class_offset(lv, (E30x4*), ABISELECT(16,8), "G30x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G30x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x4y3.ff");
    test_class_info(&lv, &cd_G30x4y3);
    dp->~G30x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y3(Test_G30x4y3, "G30x4y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G30x4y3C1Ev();
extern void _ZN7G30x4y3D1Ev();
Name_Map name_map_G30x4y3[] = {
  NSPAIR(_ZN7G30x4y3C1Ev),
  NSPAIR(_ZN7G30x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y3[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x4y3[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x4y3[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G30x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x4y3[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y3[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y3[] = {
  {&(_ZTV7G30x4y3[6]),  6,20},
  {&(_ZTV7G30x4y3[11]),  11,20},
  {&(_ZTV7G30x4y3[15]),  15,20},
  {&(_ZTV7G30x4y3[19]),  19,20},
  {&(_tg__ZTV5E30x4__7G30x4y3[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x4y3[];
extern  VTBL_ENTRY _ZTV7G30x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y3[];
static VTBL_ENTRY alt_thunk_names57[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y3 = {  "G30x4y3", // class name
  bases_G30x4y3, 6,
  &(vtc_G30x4y3[0]), // expected_vtbl_contents
  &(vtt_G30x4y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G30x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names57,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y4  : E30x4 , F0 {
  int ff;
  ~G30x4y4(); // tgen
  G30x4y4(); // tgen
};
//SIG(1 G30x4y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G30x4y4 ::~G30x4y4(){ note_dtor("G30x4y4", this);} // tgen
G30x4y4 ::G30x4y4(){ note_ctor("G30x4y4", this);} // tgen

static void Test_G30x4y4()
{
  extern Class_Descriptor cd_G30x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x4y4, buf);
    G30x4y4 *dp, &lv = *(dp=new (buf) G30x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y4)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(28,24), "G30x4y4");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(32,28), "G30x4y4");
    check_base_class_offset(lv, (C30*)(E30x4*), 0, "G30x4y4");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(12,8), "G30x4y4");
    check_base_class_offset(lv, (E30x4*), 0, "G30x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G30x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G30x4y4.ff");
    test_class_info(&lv, &cd_G30x4y4);
    dp->~G30x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y4(Test_G30x4y4, "G30x4y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G30x4y4C1Ev();
extern void _ZN7G30x4y4D1Ev();
Name_Map name_map_G30x4y4[] = {
  NSPAIR(_ZN7G30x4y4C1Ev),
  NSPAIR(_ZN7G30x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y4[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G30x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x4y4[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y4[] = {
  ABISELECT(-32,-28),
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y4[] = {
  {&(_ZTV7G30x4y4[4]),  4,9},
  {&(_tg__ZTV5E30x4__7G30x4y4[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y4[3]),  3,4},
  {&(_ZTV7G30x4y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G30x4y4[];
extern  VTBL_ENTRY _ZTV7G30x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y4[];
static VTBL_ENTRY alt_thunk_names58[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn28_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y4 = {  "G30x4y4", // class name
  bases_G30x4y4, 6,
  &(vtc_G30x4y4[0]), // expected_vtbl_contents
  &(vtt_G30x4y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G30x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names58,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y5  : virtual E30x4 , F0 {
  int ff;
  ~G30x4y5(); // tgen
  G30x4y5(); // tgen
};
//SIG(1 G30x4y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G30x4y5 ::~G30x4y5(){ note_dtor("G30x4y5", this);} // tgen
G30x4y5 ::G30x4y5(){ note_ctor("G30x4y5", this);} // tgen

static void Test_G30x4y5()
{
  extern Class_Descriptor cd_G30x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x4y5, buf);
    G30x4y5 *dp, &lv = *(dp=new (buf) G30x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y5)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(36,28), "G30x4y5");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(40,32), "G30x4y5");
    check_base_class_offset(lv, (C30*)(E30x4*), ABISELECT(16,12), "G30x4y5");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(28,20), "G30x4y5");
    check_base_class_offset(lv, (E30x4*), ABISELECT(16,12), "G30x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x4y5.ff");
    test_class_info(&lv, &cd_G30x4y5);
    dp->~G30x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y5(Test_G30x4y5, "G30x4y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x4y5C1Ev();
extern void _ZN7G30x4y5D1Ev();
Name_Map name_map_G30x4y5[] = {
  NSPAIR(_ZN7G30x4y5C1Ev),
  NSPAIR(_ZN7G30x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y5[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x4y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x4y5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G30x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x4y5[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y5[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y5[] = {
  {&(_ZTV7G30x4y5[5]),  5,15},
  {&(_ZTV7G30x4y5[10]),  10,15},
  {&(_ZTV7G30x4y5[14]),  14,15},
  {&(_tg__ZTV5E30x4__7G30x4y5[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x4y5[];
extern  VTBL_ENTRY _ZTV7G30x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y5[];
static VTBL_ENTRY alt_thunk_names59[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y5 = {  "G30x4y5", // class name
  bases_G30x4y5, 6,
  &(vtc_G30x4y5[0]), // expected_vtbl_contents
  &(vtt_G30x4y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names59,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y6  : E30x4 , virtual F0 {
  int ff;
  ~G30x4y6(); // tgen
  G30x4y6(); // tgen
};
//SIG(1 G30x4y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x4y6 ::~G30x4y6(){ note_dtor("G30x4y6", this);} // tgen
G30x4y6 ::G30x4y6(){ note_ctor("G30x4y6", this);} // tgen

static void Test_G30x4y6()
{
  extern Class_Descriptor cd_G30x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x4y6, buf);
    G30x4y6 *dp, &lv = *(dp=new (buf) G30x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y6)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(24,20), "G30x4y6");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(32,24), "G30x4y6");
    check_base_class_offset(lv, (C30*)(E30x4*), 0, "G30x4y6");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(12,8), "G30x4y6");
    check_base_class_offset(lv, (E30x4*), 0, "G30x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G30x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x4y6.ff");
    test_class_info(&lv, &cd_G30x4y6);
    dp->~G30x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y6(Test_G30x4y6, "G30x4y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G30x4y6C1Ev();
extern void _ZN7G30x4y6D1Ev();
Name_Map name_map_G30x4y6[] = {
  NSPAIR(_ZN7G30x4y6C1Ev),
  NSPAIR(_ZN7G30x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y6[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x4y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x4y6[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y6[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y6[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y6[] = {
  {&(_ZTV7G30x4y6[5]),  5,10},
  {&(_tg__ZTV5E30x4__7G30x4y6[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y6[3]),  3,4},
  {&(_ZTV7G30x4y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G30x4y6[];
extern  VTBL_ENTRY _ZTV7G30x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y6[];
static VTBL_ENTRY alt_thunk_names60[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y6 = {  "G30x4y6", // class name
  bases_G30x4y6, 6,
  &(vtc_G30x4y6[0]), // expected_vtbl_contents
  &(vtt_G30x4y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G30x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names60,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x4y7  : virtual E30x4 , virtual F0 {
  int ff;
  ~G30x4y7(); // tgen
  G30x4y7(); // tgen
};
//SIG(1 G30x4y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x4y7 ::~G30x4y7(){ note_dtor("G30x4y7", this);} // tgen
G30x4y7 ::G30x4y7(){ note_ctor("G30x4y7", this);} // tgen

static void Test_G30x4y7()
{
  extern Class_Descriptor cd_G30x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x4y7, buf);
    G30x4y7 *dp, &lv = *(dp=new (buf) G30x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x4y7)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x4*), ABISELECT(36,24), "G30x4y7");
    check_base_class_offset(lv, (B1*)(C30*)(E30x4*), ABISELECT(40,28), "G30x4y7");
    check_base_class_offset(lv, (C30*)(E30x4*), ABISELECT(16,8), "G30x4y7");
    check_base_class_offset(lv, (D0*)(E30x4*), ABISELECT(28,16), "G30x4y7");
    check_base_class_offset(lv, (E30x4*), ABISELECT(16,8), "G30x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G30x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x4y7.ff");
    test_class_info(&lv, &cd_G30x4y7);
    dp->~G30x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x4y7(Test_G30x4y7, "G30x4y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x4y7C1Ev();
extern void _ZN7G30x4y7D1Ev();
Name_Map name_map_G30x4y7[] = {
  NSPAIR(_ZN7G30x4y7C1Ev),
  NSPAIR(_ZN7G30x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x4;
extern VTBL_ENTRY _ZTI5E30x4[];
extern  VTBL_ENTRY _ZTV5E30x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x4y7[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x4y7[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x4y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x4y7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x4y7[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x4__7G30x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x4__7G30x4y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x4__7G30x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x4__7G30x4y7[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x4y7[] = {
  {&(_ZTV7G30x4y7[6]),  6,16},
  {&(_ZTV7G30x4y7[11]),  11,16},
  {&(_ZTV7G30x4y7[15]),  15,16},
  {&(_tg__ZTV5E30x4__7G30x4y7[4]),  4,5},
  {&(_tg__ZTV3C305E30x4__7G30x4y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x4__7G30x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x4__7G30x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x4y7[];
extern  VTBL_ENTRY _ZTV7G30x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x4y7[];
static VTBL_ENTRY alt_thunk_names61[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x4y7 = {  "G30x4y7", // class name
  bases_G30x4y7, 6,
  &(vtc_G30x4y7[0]), // expected_vtbl_contents
  &(vtt_G30x4y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x4y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x4y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names61,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x4  : C31 , D0 {
  int fd;
  ~E31x4(); // tgen
  E31x4(); // tgen
};
//SIG(-1 E31x4) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E31x4 ::~E31x4(){ note_dtor("E31x4", this);} // tgen
E31x4 ::E31x4(){ note_ctor("E31x4", this);} // tgen

static void Test_E31x4()
{
  extern Class_Descriptor cd_E31x4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E31x4, buf);
    E31x4 *dp, &lv = *(dp=new (buf) E31x4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E31x4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x4)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(24,16), "E31x4");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(40,24), "E31x4");
    check_base_class_offset(lv, (C31*), 0, "E31x4");
    check_base_class_offset(lv, (D0*), ABISELECT(12,8), "E31x4");
    check_field_offset(lv, fd, ABISELECT(16,12), "E31x4.fd");
    test_class_info(&lv, &cd_E31x4);
    dp->~E31x4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x4(Test_E31x4, "E31x4", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN5E31x4C1Ev();
extern void _ZN5E31x4D1Ev();
Name_Map name_map_E31x4[] = {
  NSPAIR(_ZN5E31x4C1Ev),
  NSPAIR(_ZN5E31x4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E31x4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E31x4[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x4[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV5E31x4[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x4[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__5E31x4[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__5E31x4[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x4[] = {
  {&(_ZTV5E31x4[4]),  4,13},
  {&(_tg__ZTV3C31__5E31x4[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__5E31x4[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__5E31x4[3]),  3,4},
  {&(_ZTV5E31x4[8]),  8,13},
  {&(_ZTV5E31x4[12]),  12,13},
};
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
static VTBL_ENTRY alt_thunk_names62[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x4 = {  "E31x4", // class name
  bases_E31x4, 4,
  &(vtc_E31x4[0]), // expected_vtbl_contents
  &(vtt_E31x4[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI5E31x4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E31x4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E31x4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names62,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y0  : E31x4 , F1 {
  int ff;
  ~G31x4y0(); // tgen
  G31x4y0(); // tgen
};
//SIG(1 G31x4y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x4y0 ::~G31x4y0(){ note_dtor("G31x4y0", this);} // tgen
G31x4y0 ::G31x4y0(){ note_ctor("G31x4y0", this);} // tgen

static void Test_G31x4y0()
{
  extern Class_Descriptor cd_G31x4y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x4y0, buf);
    G31x4y0 *dp, &lv = *(dp=new (buf) G31x4y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x4y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y0)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(40,28), "G31x4y0");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(56,36), "G31x4y0");
    check_base_class_offset(lv, (C31*)(E31x4*), 0, "G31x4y0");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(12,8), "G31x4y0");
    check_base_class_offset(lv, (E31x4*), 0, "G31x4y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G31x4y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G31x4y0.ff");
    test_class_info(&lv, &cd_G31x4y0);
    dp->~G31x4y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y0(Test_G31x4y0, "G31x4y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x4y0C1Ev();
extern void _ZN7G31x4y0D1Ev();
Name_Map name_map_G31x4y0[] = {
  NSPAIR(_ZN7G31x4y0C1Ev),
  NSPAIR(_ZN7G31x4y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x4y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y0[];
extern void _ZN3C313fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x4y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y0[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G31x4y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G31x4y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x4y0[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y0[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y0[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y0[] = {
  ABISELECT(-56,-36),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y0[] = {
  {&(_ZTV7G31x4y0[4]),  4,16},
  {&(_tg__ZTV5E31x4__7G31x4y0[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y0[3]),  3,4},
  {&(_ZTV7G31x4y0[11]),  11,16},
  {&(_ZTV7G31x4y0[15]),  15,16},
};
extern VTBL_ENTRY _ZTI7G31x4y0[];
extern  VTBL_ENTRY _ZTV7G31x4y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y0[];
static VTBL_ENTRY alt_thunk_names63[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn56_N3C313fooEv,_ZThn36_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y0 = {  "G31x4y0", // class name
  bases_G31x4y0, 6,
  &(vtc_G31x4y0[0]), // expected_vtbl_contents
  &(vtt_G31x4y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x4y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y0),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names63,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y1  : virtual E31x4 , F1 {
  int ff;
  ~G31x4y1(); // tgen
  G31x4y1(); // tgen
};
//SIG(1 G31x4y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x4y1 ::~G31x4y1(){ note_dtor("G31x4y1", this);} // tgen
G31x4y1 ::G31x4y1(){ note_ctor("G31x4y1", this);} // tgen

static void Test_G31x4y1()
{
  extern Class_Descriptor cd_G31x4y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x4y1, buf);
    G31x4y1 *dp, &lv = *(dp=new (buf) G31x4y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x4y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y1)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(40,28), "G31x4y1");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(56,36), "G31x4y1");
    check_base_class_offset(lv, (C31*)(E31x4*), ABISELECT(16,12), "G31x4y1");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(28,20), "G31x4y1");
    check_base_class_offset(lv, (E31x4*), ABISELECT(16,12), "G31x4y1");
    check_base_class_offset(lv, (F1*), 0, "G31x4y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x4y1.ff");
    test_class_info(&lv, &cd_G31x4y1);
    dp->~G31x4y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y1(Test_G31x4y1, "G31x4y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x4y1C1Ev();
extern void _ZN7G31x4y1D1Ev();
Name_Map name_map_G31x4y1[] = {
  NSPAIR(_ZN7G31x4y1C1Ev),
  NSPAIR(_ZN7G31x4y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x4y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x4y1[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x4y1[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G31x4y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x4y1[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y1[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y1[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y1[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y1[] = {
  {&(_ZTV7G31x4y1[5]),  5,20},
  {&(_ZTV7G31x4y1[11]),  11,20},
  {&(_ZTV7G31x4y1[15]),  15,20},
  {&(_ZTV7G31x4y1[19]),  19,20},
  {&(_tg__ZTV5E31x4__7G31x4y1[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x4y1[];
extern  VTBL_ENTRY _ZTV7G31x4y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y1[];
static VTBL_ENTRY alt_thunk_names64[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y1 = {  "G31x4y1", // class name
  bases_G31x4y1, 6,
  &(vtc_G31x4y1[0]), // expected_vtbl_contents
  &(vtt_G31x4y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x4y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y1),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y1),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names64,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y2  : E31x4 , virtual F1 {
  int ff;
  ~G31x4y2(); // tgen
  G31x4y2(); // tgen
};
//SIG(1 G31x4y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x4y2 ::~G31x4y2(){ note_dtor("G31x4y2", this);} // tgen
G31x4y2 ::G31x4y2(){ note_ctor("G31x4y2", this);} // tgen

static void Test_G31x4y2()
{
  extern Class_Descriptor cd_G31x4y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x4y2, buf);
    G31x4y2 *dp, &lv = *(dp=new (buf) G31x4y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x4y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y2)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(24,20), "G31x4y2");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(40,28), "G31x4y2");
    check_base_class_offset(lv, (C31*)(E31x4*), 0, "G31x4y2");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(12,8), "G31x4y2");
    check_base_class_offset(lv, (E31x4*), 0, "G31x4y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G31x4y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x4y2.ff");
    test_class_info(&lv, &cd_G31x4y2);
    dp->~G31x4y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y2(Test_G31x4y2, "G31x4y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x4y2C1Ev();
extern void _ZN7G31x4y2D1Ev();
Name_Map name_map_G31x4y2[] = {
  NSPAIR(_ZN7G31x4y2C1Ev),
  NSPAIR(_ZN7G31x4y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x4y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    10, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y2[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x4y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y2[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G31x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x4y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G31x4y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x4y2[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y2[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y2[] = {
  {&(_ZTV7G31x4y2[5]),  5,18},
  {&(_tg__ZTV5E31x4__7G31x4y2[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y2[3]),  3,4},
  {&(_ZTV7G31x4y2[9]),  9,18},
  {&(_ZTV7G31x4y2[13]),  13,18},
  {&(_ZTV7G31x4y2[17]),  17,18},
};
extern VTBL_ENTRY _ZTI7G31x4y2[];
extern  VTBL_ENTRY _ZTV7G31x4y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y2[];
static VTBL_ENTRY alt_thunk_names65[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y2 = {  "G31x4y2", // class name
  bases_G31x4y2, 6,
  &(vtc_G31x4y2[0]), // expected_vtbl_contents
  &(vtt_G31x4y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x4y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y2),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names65,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y3  : virtual E31x4 , virtual F1 {
  int ff;
  ~G31x4y3(); // tgen
  G31x4y3(); // tgen
};
//SIG(1 G31x4y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x4y3 ::~G31x4y3(){ note_dtor("G31x4y3", this);} // tgen
G31x4y3 ::G31x4y3(){ note_ctor("G31x4y3", this);} // tgen

static void Test_G31x4y3()
{
  extern Class_Descriptor cd_G31x4y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G31x4y3, buf);
    G31x4y3 *dp, &lv = *(dp=new (buf) G31x4y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G31x4y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y3)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(40,24), "G31x4y3");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(56,32), "G31x4y3");
    check_base_class_offset(lv, (C31*)(E31x4*), ABISELECT(16,8), "G31x4y3");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(28,16), "G31x4y3");
    check_base_class_offset(lv, (E31x4*), ABISELECT(16,8), "G31x4y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G31x4y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x4y3.ff");
    test_class_info(&lv, &cd_G31x4y3);
    dp->~G31x4y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y3(Test_G31x4y3, "G31x4y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G31x4y3C1Ev();
extern void _ZN7G31x4y3D1Ev();
Name_Map name_map_G31x4y3[] = {
  NSPAIR(_ZN7G31x4y3C1Ev),
  NSPAIR(_ZN7G31x4y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x4y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y3[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x4y3[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y3[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x4y3[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G31x4y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G31x4y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x4y3[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y3[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y3[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y3[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y3[] = {
  {&(_ZTV7G31x4y3[6]),  6,24},
  {&(_ZTV7G31x4y3[11]),  11,24},
  {&(_ZTV7G31x4y3[15]),  15,24},
  {&(_ZTV7G31x4y3[19]),  19,24},
  {&(_ZTV7G31x4y3[23]),  23,24},
  {&(_tg__ZTV5E31x4__7G31x4y3[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x4y3[];
extern  VTBL_ENTRY _ZTV7G31x4y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y3[];
static VTBL_ENTRY alt_thunk_names66[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y3 = {  "G31x4y3", // class name
  bases_G31x4y3, 6,
  &(vtc_G31x4y3[0]), // expected_vtbl_contents
  &(vtt_G31x4y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G31x4y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y3),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y3),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names66,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y4  : E31x4 , F0 {
  int ff;
  ~G31x4y4(); // tgen
  G31x4y4(); // tgen
};
//SIG(1 G31x4y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G31x4y4 ::~G31x4y4(){ note_dtor("G31x4y4", this);} // tgen
G31x4y4 ::G31x4y4(){ note_ctor("G31x4y4", this);} // tgen

static void Test_G31x4y4()
{
  extern Class_Descriptor cd_G31x4y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G31x4y4, buf);
    G31x4y4 *dp, &lv = *(dp=new (buf) G31x4y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G31x4y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y4)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(32,24), "G31x4y4");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(48,32), "G31x4y4");
    check_base_class_offset(lv, (C31*)(E31x4*), 0, "G31x4y4");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(12,8), "G31x4y4");
    check_base_class_offset(lv, (E31x4*), 0, "G31x4y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G31x4y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G31x4y4.ff");
    test_class_info(&lv, &cd_G31x4y4);
    dp->~G31x4y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y4(Test_G31x4y4, "G31x4y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G31x4y4C1Ev();
extern void _ZN7G31x4y4D1Ev();
Name_Map name_map_G31x4y4[] = {
  NSPAIR(_ZN7G31x4y4C1Ev),
  NSPAIR(_ZN7G31x4y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x4y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y4[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x4y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x4y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x4y4[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y4[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y4[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y4[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y4[] = {
  {&(_ZTV7G31x4y4[4]),  4,13},
  {&(_tg__ZTV5E31x4__7G31x4y4[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y4[3]),  3,4},
  {&(_ZTV7G31x4y4[8]),  8,13},
  {&(_ZTV7G31x4y4[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G31x4y4[];
extern  VTBL_ENTRY _ZTV7G31x4y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y4[];
static VTBL_ENTRY alt_thunk_names67[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y4 = {  "G31x4y4", // class name
  bases_G31x4y4, 6,
  &(vtc_G31x4y4[0]), // expected_vtbl_contents
  &(vtt_G31x4y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G31x4y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y4),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names67,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y5  : virtual E31x4 , F0 {
  int ff;
  ~G31x4y5(); // tgen
  G31x4y5(); // tgen
};
//SIG(1 G31x4y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G31x4y5 ::~G31x4y5(){ note_dtor("G31x4y5", this);} // tgen
G31x4y5 ::G31x4y5(){ note_ctor("G31x4y5", this);} // tgen

static void Test_G31x4y5()
{
  extern Class_Descriptor cd_G31x4y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x4y5, buf);
    G31x4y5 *dp, &lv = *(dp=new (buf) G31x4y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x4y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y5)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(40,28), "G31x4y5");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(56,36), "G31x4y5");
    check_base_class_offset(lv, (C31*)(E31x4*), ABISELECT(16,12), "G31x4y5");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(28,20), "G31x4y5");
    check_base_class_offset(lv, (E31x4*), ABISELECT(16,12), "G31x4y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x4y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x4y5.ff");
    test_class_info(&lv, &cd_G31x4y5);
    dp->~G31x4y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y5(Test_G31x4y5, "G31x4y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x4y5C1Ev();
extern void _ZN7G31x4y5D1Ev();
Name_Map name_map_G31x4y5[] = {
  NSPAIR(_ZN7G31x4y5C1Ev),
  NSPAIR(_ZN7G31x4y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x4y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y5[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x4y5[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y5[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x4y5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G31x4y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x4y5[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y5[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y5[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y5[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y5[] = {
  {&(_ZTV7G31x4y5[5]),  5,19},
  {&(_ZTV7G31x4y5[10]),  10,19},
  {&(_ZTV7G31x4y5[14]),  14,19},
  {&(_ZTV7G31x4y5[18]),  18,19},
  {&(_tg__ZTV5E31x4__7G31x4y5[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x4y5[];
extern  VTBL_ENTRY _ZTV7G31x4y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y5[];
static VTBL_ENTRY alt_thunk_names68[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y5 = {  "G31x4y5", // class name
  bases_G31x4y5, 6,
  &(vtc_G31x4y5[0]), // expected_vtbl_contents
  &(vtt_G31x4y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x4y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y5),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y5),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names68,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y6  : E31x4 , virtual F0 {
  int ff;
  ~G31x4y6(); // tgen
  G31x4y6(); // tgen
};
//SIG(1 G31x4y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x4y6 ::~G31x4y6(){ note_dtor("G31x4y6", this);} // tgen
G31x4y6 ::G31x4y6(){ note_ctor("G31x4y6", this);} // tgen

static void Test_G31x4y6()
{
  extern Class_Descriptor cd_G31x4y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G31x4y6, buf);
    G31x4y6 *dp, &lv = *(dp=new (buf) G31x4y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G31x4y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y6)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(24,20), "G31x4y6");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(40,28), "G31x4y6");
    check_base_class_offset(lv, (C31*)(E31x4*), 0, "G31x4y6");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(12,8), "G31x4y6");
    check_base_class_offset(lv, (E31x4*), 0, "G31x4y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G31x4y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x4y6.ff");
    test_class_info(&lv, &cd_G31x4y6);
    dp->~G31x4y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y6(Test_G31x4y6, "G31x4y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G31x4y6C1Ev();
extern void _ZN7G31x4y6D1Ev();
Name_Map name_map_G31x4y6[] = {
  NSPAIR(_ZN7G31x4y6C1Ev),
  NSPAIR(_ZN7G31x4y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x4y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y6[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x4y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G31x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x4y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x4y6[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y6[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y6[] = {
  {&(_ZTV7G31x4y6[5]),  5,14},
  {&(_tg__ZTV5E31x4__7G31x4y6[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y6[3]),  3,4},
  {&(_ZTV7G31x4y6[9]),  9,14},
  {&(_ZTV7G31x4y6[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G31x4y6[];
extern  VTBL_ENTRY _ZTV7G31x4y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y6[];
static VTBL_ENTRY alt_thunk_names69[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y6 = {  "G31x4y6", // class name
  bases_G31x4y6, 6,
  &(vtc_G31x4y6[0]), // expected_vtbl_contents
  &(vtt_G31x4y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G31x4y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y6),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names69,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x4y7  : virtual E31x4 , virtual F0 {
  int ff;
  ~G31x4y7(); // tgen
  G31x4y7(); // tgen
};
//SIG(1 G31x4y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x4y7 ::~G31x4y7(){ note_dtor("G31x4y7", this);} // tgen
G31x4y7 ::G31x4y7(){ note_ctor("G31x4y7", this);} // tgen

static void Test_G31x4y7()
{
  extern Class_Descriptor cd_G31x4y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x4y7, buf);
    G31x4y7 *dp, &lv = *(dp=new (buf) G31x4y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x4y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x4y7)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x4*), ABISELECT(40,24), "G31x4y7");
    check_base_class_offset(lv, (B1*)(C31*)(E31x4*), ABISELECT(56,32), "G31x4y7");
    check_base_class_offset(lv, (C31*)(E31x4*), ABISELECT(16,8), "G31x4y7");
    check_base_class_offset(lv, (D0*)(E31x4*), ABISELECT(28,16), "G31x4y7");
    check_base_class_offset(lv, (E31x4*), ABISELECT(16,8), "G31x4y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G31x4y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x4y7.ff");
    test_class_info(&lv, &cd_G31x4y7);
    dp->~G31x4y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x4y7(Test_G31x4y7, "G31x4y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x4y7C1Ev();
extern void _ZN7G31x4y7D1Ev();
Name_Map name_map_G31x4y7[] = {
  NSPAIR(_ZN7G31x4y7C1Ev),
  NSPAIR(_ZN7G31x4y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x4;
extern VTBL_ENTRY _ZTI5E31x4[];
extern  VTBL_ENTRY _ZTV5E31x4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x4[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x4y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x4,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x4y7[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x4y7[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x4y7[0]),
  0,
  ABISELECT(40,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x4y7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G31x4y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x4y7[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x4__7G31x4y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x4__7G31x4y7[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x4__7G31x4y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x4__7G31x4y7[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x4__7G31x4y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x4__7G31x4y7[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x4y7[] = {
  {&(_ZTV7G31x4y7[6]),  6,20},
  {&(_ZTV7G31x4y7[11]),  11,20},
  {&(_ZTV7G31x4y7[15]),  15,20},
  {&(_ZTV7G31x4y7[19]),  19,20},
  {&(_tg__ZTV5E31x4__7G31x4y7[4]),  4,5},
  {&(_tg__ZTV3C315E31x4__7G31x4y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x4__7G31x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x4__7G31x4y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x4__7G31x4y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x4__7G31x4y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x4y7[];
extern  VTBL_ENTRY _ZTV7G31x4y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x4y7[];
static VTBL_ENTRY alt_thunk_names70[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x4y7 = {  "G31x4y7", // class name
  bases_G31x4y7, 6,
  &(vtc_G31x4y7[0]), // expected_vtbl_contents
  &(vtt_G31x4y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x4y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x4y7),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x4y7),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names70,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E0x5  : virtual C0 , D0 {
  int fd;
  ~E0x5(); // tgen
  E0x5(); // tgen
};
//SIG(-1 E0x5) C1{ VBC2{ BC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E0x5 ::~E0x5(){ note_dtor("E0x5", this);} // tgen
E0x5 ::E0x5(){ note_ctor("E0x5", this);} // tgen

static void Test_E0x5()
{
  extern Class_Descriptor cd_E0x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x5, buf);
    E0x5 *dp, &lv = *(dp=new (buf) E0x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x5)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(16,12), "E0x5");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(20,16), "E0x5");
    check_base_class_offset(lv, (C0*), ABISELECT(16,12), "E0x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E0x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E0x5.fd");
    test_class_info(&lv, &cd_E0x5);
    dp->~E0x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x5(Test_E0x5, "E0x5", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E0x5C1Ev();
extern void _ZN4E0x5D1Ev();
Name_Map name_map_E0x5[] = {
  NSPAIR(_ZN4E0x5C1Ev),
  NSPAIR(_ZN4E0x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E0x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E0x5[];
static  VTBL_ENTRY vtc_E0x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
extern VTBL_ENTRY _ZTV4E0x5[];
static  VTT_ENTRY vtt_E0x5[] = {
  {&(_ZTV4E0x5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
Class_Descriptor cd_E0x5 = {  "E0x5", // class name
  bases_E0x5, 4,
  &(vtc_E0x5[0]), // expected_vtbl_contents
  &(vtt_E0x5[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E0x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E0x5),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E0x5),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y0  : E0x5 , F1 {
  int ff;
  ~G0x5y0(); // tgen
  G0x5y0(); // tgen
};
//SIG(1 G0x5y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x5y0 ::~G0x5y0(){ note_dtor("G0x5y0", this);} // tgen
G0x5y0 ::G0x5y0(){ note_ctor("G0x5y0", this);} // tgen

static void Test_G0x5y0()
{
  extern Class_Descriptor cd_G0x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x5y0, buf);
    G0x5y0 *dp, &lv = *(dp=new (buf) G0x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y0)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,24), "G0x5y0");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,28), "G0x5y0");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(32,24), "G0x5y0");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(8,4), "G0x5y0");
    check_base_class_offset(lv, (E0x5*), 0, "G0x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G0x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G0x5y0.ff");
    test_class_info(&lv, &cd_G0x5y0);
    dp->~G0x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y0(Test_G0x5y0, "G0x5y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x5y0C1Ev();
extern void _ZN6G0x5y0D1Ev();
Name_Map name_map_G0x5y0[] = {
  NSPAIR(_ZN6G0x5y0C1Ev),
  NSPAIR(_ZN6G0x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x5y0[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y0[] = {
  {&(_ZTV6G0x5y0[3]),  3,6},
  {&(_tg__ZTV4E0x5__6G0x5y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y0[];
extern  VTBL_ENTRY _ZTV6G0x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y0[];
Class_Descriptor cd_G0x5y0 = {  "G0x5y0", // class name
  bases_G0x5y0, 6,
  &(vtc_G0x5y0[0]), // expected_vtbl_contents
  &(vtt_G0x5y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y0),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y0),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y1  : virtual E0x5 , F1 {
  int ff;
  ~G0x5y1(); // tgen
  G0x5y1(); // tgen
};
//SIG(1 G0x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x5y1 ::~G0x5y1(){ note_dtor("G0x5y1", this);} // tgen
G0x5y1 ::G0x5y1(){ note_ctor("G0x5y1", this);} // tgen

static void Test_G0x5y1()
{
  extern Class_Descriptor cd_G0x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x5y1, buf);
    G0x5y1 *dp, &lv = *(dp=new (buf) G0x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y1)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,24), "G0x5y1");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,28), "G0x5y1");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(32,24), "G0x5y1");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(24,16), "G0x5y1");
    check_base_class_offset(lv, (E0x5*), ABISELECT(16,12), "G0x5y1");
    check_base_class_offset(lv, (F1*), 0, "G0x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x5y1.ff");
    test_class_info(&lv, &cd_G0x5y1);
    dp->~G0x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y1(Test_G0x5y1, "G0x5y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x5y1C1Ev();
extern void _ZN6G0x5y1D1Ev();
Name_Map name_map_G0x5y1[] = {
  NSPAIR(_ZN6G0x5y1C1Ev),
  NSPAIR(_ZN6G0x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x5y1[0]),
};
extern VTBL_ENTRY _ZTV6G0x5y1[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y1[] = {
  {&(_ZTV6G0x5y1[4]),  4,8},
  {&(_ZTV6G0x5y1[8]),  8,8},
  {&(_tg__ZTV4E0x5__6G0x5y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y1[];
extern  VTBL_ENTRY _ZTV6G0x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y1[];
Class_Descriptor cd_G0x5y1 = {  "G0x5y1", // class name
  bases_G0x5y1, 6,
  &(vtc_G0x5y1[0]), // expected_vtbl_contents
  &(vtt_G0x5y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y1),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y1),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y2  : E0x5 , virtual F1 {
  int ff;
  ~G0x5y2(); // tgen
  G0x5y2(); // tgen
};
//SIG(1 G0x5y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x5y2 ::~G0x5y2(){ note_dtor("G0x5y2", this);} // tgen
G0x5y2 ::G0x5y2(){ note_ctor("G0x5y2", this);} // tgen

static void Test_G0x5y2()
{
  extern Class_Descriptor cd_G0x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x5y2, buf);
    G0x5y2 *dp, &lv = *(dp=new (buf) G0x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y2)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(20,16), "G0x5y2");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(24,20), "G0x5y2");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(20,16), "G0x5y2");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(8,4), "G0x5y2");
    check_base_class_offset(lv, (E0x5*), 0, "G0x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G0x5y2.ff");
    test_class_info(&lv, &cd_G0x5y2);
    dp->~G0x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y2(Test_G0x5y2, "G0x5y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x5y2C1Ev();
extern void _ZN6G0x5y2D1Ev();
Name_Map name_map_G0x5y2[] = {
  NSPAIR(_ZN6G0x5y2C1Ev),
  NSPAIR(_ZN6G0x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x5y2[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G0x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x5y2[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y2[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y2[] = {
  {&(_ZTV6G0x5y2[4]),  4,8},
  {&(_tg__ZTV4E0x5__6G0x5y2[3]),  3,3},
  {&(_ZTV6G0x5y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G0x5y2[];
extern  VTBL_ENTRY _ZTV6G0x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y2[];
Class_Descriptor cd_G0x5y2 = {  "G0x5y2", // class name
  bases_G0x5y2, 6,
  &(vtc_G0x5y2[0]), // expected_vtbl_contents
  &(vtt_G0x5y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y2),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y2),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y3  : virtual E0x5 , virtual F1 {
  int ff;
  ~G0x5y3(); // tgen
  G0x5y3(); // tgen
};
//SIG(1 G0x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x5y3 ::~G0x5y3(){ note_dtor("G0x5y3", this);} // tgen
G0x5y3 ::G0x5y3(){ note_ctor("G0x5y3", this);} // tgen

static void Test_G0x5y3()
{
  extern Class_Descriptor cd_G0x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x5y3, buf);
    G0x5y3 *dp, &lv = *(dp=new (buf) G0x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y3)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,20), "G0x5y3");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,24), "G0x5y3");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(32,20), "G0x5y3");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(24,12), "G0x5y3");
    check_base_class_offset(lv, (E0x5*), ABISELECT(16,8), "G0x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x5y3.ff");
    test_class_info(&lv, &cd_G0x5y3);
    dp->~G0x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y3(Test_G0x5y3, "G0x5y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G0x5y3C1Ev();
extern void _ZN6G0x5y3D1Ev();
Name_Map name_map_G0x5y3[] = {
  NSPAIR(_ZN6G0x5y3C1Ev),
  NSPAIR(_ZN6G0x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x5y3[] = {
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x5y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G0x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x5y3[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y3[] = {
  {&(_ZTV6G0x5y3[5]),  5,12},
  {&(_ZTV6G0x5y3[8]),  8,12},
  {&(_ZTV6G0x5y3[11]),  11,12},
  {&(_tg__ZTV4E0x5__6G0x5y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y3[];
extern  VTBL_ENTRY _ZTV6G0x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y3[];
Class_Descriptor cd_G0x5y3 = {  "G0x5y3", // class name
  bases_G0x5y3, 6,
  &(vtc_G0x5y3[0]), // expected_vtbl_contents
  &(vtt_G0x5y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G0x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y3),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y3),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y4  : E0x5 , F0 {
  int ff;
  ~G0x5y4(); // tgen
  G0x5y4(); // tgen
};
//SIG(1 G0x5y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G0x5y4 ::~G0x5y4(){ note_dtor("G0x5y4", this);} // tgen
G0x5y4 ::G0x5y4(){ note_ctor("G0x5y4", this);} // tgen

static void Test_G0x5y4()
{
  extern Class_Descriptor cd_G0x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x5y4, buf);
    G0x5y4 *dp, &lv = *(dp=new (buf) G0x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y4)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(24,20), "G0x5y4");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(28,24), "G0x5y4");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(24,20), "G0x5y4");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(8,4), "G0x5y4");
    check_base_class_offset(lv, (E0x5*), 0, "G0x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G0x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G0x5y4.ff");
    test_class_info(&lv, &cd_G0x5y4);
    dp->~G0x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y4(Test_G0x5y4, "G0x5y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x5y4C1Ev();
extern void _ZN6G0x5y4D1Ev();
Name_Map name_map_G0x5y4[] = {
  NSPAIR(_ZN6G0x5y4C1Ev),
  NSPAIR(_ZN6G0x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y4[];
static  VTBL_ENTRY vtc_G0x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y4[0]),
};
extern VTBL_ENTRY _ZTV6G0x5y4[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y4[] = {
  {&(_ZTV6G0x5y4[3]),  3,3},
  {&(_tg__ZTV4E0x5__6G0x5y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y4[];
extern  VTBL_ENTRY _ZTV6G0x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y4[];
Class_Descriptor cd_G0x5y4 = {  "G0x5y4", // class name
  bases_G0x5y4, 6,
  &(vtc_G0x5y4[0]), // expected_vtbl_contents
  &(vtt_G0x5y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y4),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y5  : virtual E0x5 , F0 {
  int ff;
  ~G0x5y5(); // tgen
  G0x5y5(); // tgen
};
//SIG(1 G0x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G0x5y5 ::~G0x5y5(){ note_dtor("G0x5y5", this);} // tgen
G0x5y5 ::G0x5y5(){ note_ctor("G0x5y5", this);} // tgen

static void Test_G0x5y5()
{
  extern Class_Descriptor cd_G0x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x5y5, buf);
    G0x5y5 *dp, &lv = *(dp=new (buf) G0x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y5)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,24), "G0x5y5");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,28), "G0x5y5");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(32,24), "G0x5y5");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(24,16), "G0x5y5");
    check_base_class_offset(lv, (E0x5*), ABISELECT(16,12), "G0x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x5y5.ff");
    test_class_info(&lv, &cd_G0x5y5);
    dp->~G0x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y5(Test_G0x5y5, "G0x5y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x5y5C1Ev();
extern void _ZN6G0x5y5D1Ev();
Name_Map name_map_G0x5y5[] = {
  NSPAIR(_ZN6G0x5y5C1Ev),
  NSPAIR(_ZN6G0x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y5[];
static  VTBL_ENTRY vtc_G0x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x5y5[0]),
};
extern VTBL_ENTRY _ZTV6G0x5y5[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y5[] = {
  {&(_ZTV6G0x5y5[4]),  4,7},
  {&(_ZTV6G0x5y5[7]),  7,7},
  {&(_tg__ZTV4E0x5__6G0x5y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y5[];
extern  VTBL_ENTRY _ZTV6G0x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y5[];
Class_Descriptor cd_G0x5y5 = {  "G0x5y5", // class name
  bases_G0x5y5, 6,
  &(vtc_G0x5y5[0]), // expected_vtbl_contents
  &(vtt_G0x5y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y5),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y6  : E0x5 , virtual F0 {
  int ff;
  ~G0x5y6(); // tgen
  G0x5y6(); // tgen
};
//SIG(1 G0x5y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x5y6 ::~G0x5y6(){ note_dtor("G0x5y6", this);} // tgen
G0x5y6 ::G0x5y6(){ note_ctor("G0x5y6", this);} // tgen

static void Test_G0x5y6()
{
  extern Class_Descriptor cd_G0x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x5y6, buf);
    G0x5y6 *dp, &lv = *(dp=new (buf) G0x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y6)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(20,16), "G0x5y6");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(24,20), "G0x5y6");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(20,16), "G0x5y6");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(8,4), "G0x5y6");
    check_base_class_offset(lv, (E0x5*), 0, "G0x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G0x5y6.ff");
    test_class_info(&lv, &cd_G0x5y6);
    dp->~G0x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y6(Test_G0x5y6, "G0x5y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x5y6C1Ev();
extern void _ZN6G0x5y6D1Ev();
Name_Map name_map_G0x5y6[] = {
  NSPAIR(_ZN6G0x5y6C1Ev),
  NSPAIR(_ZN6G0x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y6[];
static  VTBL_ENTRY vtc_G0x5y6[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y6[0]),
};
extern VTBL_ENTRY _ZTV6G0x5y6[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y6[] = {
  {&(_ZTV6G0x5y6[4]),  4,4},
  {&(_tg__ZTV4E0x5__6G0x5y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y6[];
extern  VTBL_ENTRY _ZTV6G0x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y6[];
Class_Descriptor cd_G0x5y6 = {  "G0x5y6", // class name
  bases_G0x5y6, 6,
  &(vtc_G0x5y6[0]), // expected_vtbl_contents
  &(vtt_G0x5y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y6),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x5y7  : virtual E0x5 , virtual F0 {
  int ff;
  ~G0x5y7(); // tgen
  G0x5y7(); // tgen
};
//SIG(1 G0x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x5y7 ::~G0x5y7(){ note_dtor("G0x5y7", this);} // tgen
G0x5y7 ::G0x5y7(){ note_ctor("G0x5y7", this);} // tgen

static void Test_G0x5y7()
{
  extern Class_Descriptor cd_G0x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x5y7, buf);
    G0x5y7 *dp, &lv = *(dp=new (buf) G0x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x5y7)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,20), "G0x5y7");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,24), "G0x5y7");
    check_base_class_offset(lv, (C0*)(E0x5*), ABISELECT(32,20), "G0x5y7");
    check_base_class_offset(lv, (D0*)(E0x5*), ABISELECT(24,12), "G0x5y7");
    check_base_class_offset(lv, (E0x5*), ABISELECT(16,8), "G0x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x5y7.ff");
    test_class_info(&lv, &cd_G0x5y7);
    dp->~G0x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x5y7(Test_G0x5y7, "G0x5y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x5y7C1Ev();
extern void _ZN6G0x5y7D1Ev();
Name_Map name_map_G0x5y7[] = {
  NSPAIR(_ZN6G0x5y7C1Ev),
  NSPAIR(_ZN6G0x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x5;
extern VTBL_ENTRY _ZTI4E0x5[];
extern  VTBL_ENTRY _ZTV4E0x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E0x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x5y7[];
static  VTBL_ENTRY vtc_G0x5y7[] = {
  ABISELECT(44,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x5y7[0]),
};
extern VTBL_ENTRY _ZTV6G0x5y7[];
static  VTBL_ENTRY _tg__ZTV4E0x5__6G0x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x5[0]),
};
static  VTT_ENTRY vtt_G0x5y7[] = {
  {&(_ZTV6G0x5y7[5]),  5,8},
  {&(_ZTV6G0x5y7[8]),  8,8},
  {&(_tg__ZTV4E0x5__6G0x5y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x5y7[];
extern  VTBL_ENTRY _ZTV6G0x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x5y7[];
Class_Descriptor cd_G0x5y7 = {  "G0x5y7", // class name
  bases_G0x5y7, 6,
  &(vtc_G0x5y7[0]), // expected_vtbl_contents
  &(vtt_G0x5y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x5y7),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x5y7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E1x5  : virtual C1 , D0 {
  int fd;
  ~E1x5(); // tgen
  E1x5(); // tgen
};
//SIG(-1 E1x5) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E1x5 ::~E1x5(){ note_dtor("E1x5", this);} // tgen
E1x5 ::E1x5(){ note_ctor("E1x5", this);} // tgen

static void Test_E1x5()
{
  extern Class_Descriptor cd_E1x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E1x5, buf);
    E1x5 *dp, &lv = *(dp=new (buf) E1x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E1x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x5)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,12), "E1x5");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,20), "E1x5");
    check_base_class_offset(lv, (C1*), ABISELECT(16,12), "E1x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E1x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E1x5.fd");
    test_class_info(&lv, &cd_E1x5);
    dp->~E1x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x5(Test_E1x5, "E1x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E1x5C1Ev();
extern void _ZN4E1x5D1Ev();
Name_Map name_map_E1x5[] = {
  NSPAIR(_ZN4E1x5C1Ev),
  NSPAIR(_ZN4E1x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E1x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E1x5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E1x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E1x5[];
static  VTT_ENTRY vtt_E1x5[] = {
  {&(_ZTV4E1x5[3]),  3,7},
  {&(_ZTV4E1x5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
Class_Descriptor cd_E1x5 = {  "E1x5", // class name
  bases_E1x5, 4,
  &(vtc_E1x5[0]), // expected_vtbl_contents
  &(vtt_E1x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E1x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E1x5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E1x5),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y0  : E1x5 , F1 {
  int ff;
  ~G1x5y0(); // tgen
  G1x5y0(); // tgen
};
//SIG(1 G1x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x5y0 ::~G1x5y0(){ note_dtor("G1x5y0", this);} // tgen
G1x5y0 ::G1x5y0(){ note_ctor("G1x5y0", this);} // tgen

static void Test_G1x5y0()
{
  extern Class_Descriptor cd_G1x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x5y0, buf);
    G1x5y0 *dp, &lv = *(dp=new (buf) G1x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y0)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,24), "G1x5y0");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,32), "G1x5y0");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(32,24), "G1x5y0");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(8,4), "G1x5y0");
    check_base_class_offset(lv, (E1x5*), 0, "G1x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G1x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G1x5y0.ff");
    test_class_info(&lv, &cd_G1x5y0);
    dp->~G1x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y0(Test_G1x5y0, "G1x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x5y0C1Ev();
extern void _ZN6G1x5y0D1Ev();
Name_Map name_map_G1x5y0[] = {
  NSPAIR(_ZN6G1x5y0C1Ev),
  NSPAIR(_ZN6G1x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G1x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y0[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y0[] = {
  {&(_ZTV6G1x5y0[3]),  3,10},
  {&(_tg__ZTV4E1x5__6G1x5y0[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y0[3]),  3,4},
  {&(_ZTV6G1x5y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G1x5y0[];
extern  VTBL_ENTRY _ZTV6G1x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y0[];
Class_Descriptor cd_G1x5y0 = {  "G1x5y0", // class name
  bases_G1x5y0, 6,
  &(vtc_G1x5y0[0]), // expected_vtbl_contents
  &(vtt_G1x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y1  : virtual E1x5 , F1 {
  int ff;
  ~G1x5y1(); // tgen
  G1x5y1(); // tgen
};
//SIG(1 G1x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x5y1 ::~G1x5y1(){ note_dtor("G1x5y1", this);} // tgen
G1x5y1 ::G1x5y1(){ note_ctor("G1x5y1", this);} // tgen

static void Test_G1x5y1()
{
  extern Class_Descriptor cd_G1x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x5y1, buf);
    G1x5y1 *dp, &lv = *(dp=new (buf) G1x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y1)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,24), "G1x5y1");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,32), "G1x5y1");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(32,24), "G1x5y1");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(24,16), "G1x5y1");
    check_base_class_offset(lv, (E1x5*), ABISELECT(16,12), "G1x5y1");
    check_base_class_offset(lv, (F1*), 0, "G1x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x5y1.ff");
    test_class_info(&lv, &cd_G1x5y1);
    dp->~G1x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y1(Test_G1x5y1, "G1x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x5y1C1Ev();
extern void _ZN6G1x5y1D1Ev();
Name_Map name_map_G1x5y1[] = {
  NSPAIR(_ZN6G1x5y1C1Ev),
  NSPAIR(_ZN6G1x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G1x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y1[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y1[] = {
  {&(_ZTV6G1x5y1[4]),  4,12},
  {&(_ZTV6G1x5y1[8]),  8,12},
  {&(_ZTV6G1x5y1[11]),  11,12},
  {&(_tg__ZTV4E1x5__6G1x5y1[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x5y1[];
extern  VTBL_ENTRY _ZTV6G1x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y1[];
Class_Descriptor cd_G1x5y1 = {  "G1x5y1", // class name
  bases_G1x5y1, 6,
  &(vtc_G1x5y1[0]), // expected_vtbl_contents
  &(vtt_G1x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y2  : E1x5 , virtual F1 {
  int ff;
  ~G1x5y2(); // tgen
  G1x5y2(); // tgen
};
//SIG(1 G1x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x5y2 ::~G1x5y2(){ note_dtor("G1x5y2", this);} // tgen
G1x5y2 ::G1x5y2(){ note_ctor("G1x5y2", this);} // tgen

static void Test_G1x5y2()
{
  extern Class_Descriptor cd_G1x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x5y2, buf);
    G1x5y2 *dp, &lv = *(dp=new (buf) G1x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y2)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,16), "G1x5y2");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,24), "G1x5y2");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(24,16), "G1x5y2");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(8,4), "G1x5y2");
    check_base_class_offset(lv, (E1x5*), 0, "G1x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G1x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G1x5y2.ff");
    test_class_info(&lv, &cd_G1x5y2);
    dp->~G1x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y2(Test_G1x5y2, "G1x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G1x5y2C1Ev();
extern void _ZN6G1x5y2D1Ev();
Name_Map name_map_G1x5y2[] = {
  NSPAIR(_ZN6G1x5y2C1Ev),
  NSPAIR(_ZN6G1x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G1x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G1x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y2[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y2[] = {
  {&(_ZTV6G1x5y2[4]),  4,12},
  {&(_tg__ZTV4E1x5__6G1x5y2[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y2[3]),  3,4},
  {&(_ZTV6G1x5y2[7]),  7,12},
  {&(_ZTV6G1x5y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G1x5y2[];
extern  VTBL_ENTRY _ZTV6G1x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y2[];
Class_Descriptor cd_G1x5y2 = {  "G1x5y2", // class name
  bases_G1x5y2, 6,
  &(vtc_G1x5y2[0]), // expected_vtbl_contents
  &(vtt_G1x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G1x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y3  : virtual E1x5 , virtual F1 {
  int ff;
  ~G1x5y3(); // tgen
  G1x5y3(); // tgen
};
//SIG(1 G1x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x5y3 ::~G1x5y3(){ note_dtor("G1x5y3", this);} // tgen
G1x5y3 ::G1x5y3(){ note_ctor("G1x5y3", this);} // tgen

static void Test_G1x5y3()
{
  extern Class_Descriptor cd_G1x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G1x5y3, buf);
    G1x5y3 *dp, &lv = *(dp=new (buf) G1x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G1x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y3)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x5y3");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x5y3");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(32,20), "G1x5y3");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(24,12), "G1x5y3");
    check_base_class_offset(lv, (E1x5*), ABISELECT(16,8), "G1x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G1x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x5y3.ff");
    test_class_info(&lv, &cd_G1x5y3);
    dp->~G1x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y3(Test_G1x5y3, "G1x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G1x5y3C1Ev();
extern void _ZN6G1x5y3D1Ev();
Name_Map name_map_G1x5y3[] = {
  NSPAIR(_ZN6G1x5y3C1Ev),
  NSPAIR(_ZN6G1x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G1x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G1x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y3[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y3[] = {
  {&(_ZTV6G1x5y3[5]),  5,16},
  {&(_ZTV6G1x5y3[8]),  8,16},
  {&(_ZTV6G1x5y3[11]),  11,16},
  {&(_ZTV6G1x5y3[15]),  15,16},
  {&(_tg__ZTV4E1x5__6G1x5y3[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x5y3[];
extern  VTBL_ENTRY _ZTV6G1x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y3[];
Class_Descriptor cd_G1x5y3 = {  "G1x5y3", // class name
  bases_G1x5y3, 6,
  &(vtc_G1x5y3[0]), // expected_vtbl_contents
  &(vtt_G1x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G1x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y4  : E1x5 , F0 {
  int ff;
  ~G1x5y4(); // tgen
  G1x5y4(); // tgen
};
//SIG(1 G1x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G1x5y4 ::~G1x5y4(){ note_dtor("G1x5y4", this);} // tgen
G1x5y4 ::G1x5y4(){ note_ctor("G1x5y4", this);} // tgen

static void Test_G1x5y4()
{
  extern Class_Descriptor cd_G1x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x5y4, buf);
    G1x5y4 *dp, &lv = *(dp=new (buf) G1x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y4)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,20), "G1x5y4");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,28), "G1x5y4");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(24,20), "G1x5y4");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(8,4), "G1x5y4");
    check_base_class_offset(lv, (E1x5*), 0, "G1x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G1x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G1x5y4.ff");
    test_class_info(&lv, &cd_G1x5y4);
    dp->~G1x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y4(Test_G1x5y4, "G1x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x5y4C1Ev();
extern void _ZN6G1x5y4D1Ev();
Name_Map name_map_G1x5y4[] = {
  NSPAIR(_ZN6G1x5y4C1Ev),
  NSPAIR(_ZN6G1x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G1x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y4[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y4[] = {
  {&(_ZTV6G1x5y4[3]),  3,7},
  {&(_tg__ZTV4E1x5__6G1x5y4[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y4[3]),  3,4},
  {&(_ZTV6G1x5y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI6G1x5y4[];
extern  VTBL_ENTRY _ZTV6G1x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y4[];
Class_Descriptor cd_G1x5y4 = {  "G1x5y4", // class name
  bases_G1x5y4, 6,
  &(vtc_G1x5y4[0]), // expected_vtbl_contents
  &(vtt_G1x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y5  : virtual E1x5 , F0 {
  int ff;
  ~G1x5y5(); // tgen
  G1x5y5(); // tgen
};
//SIG(1 G1x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G1x5y5 ::~G1x5y5(){ note_dtor("G1x5y5", this);} // tgen
G1x5y5 ::G1x5y5(){ note_ctor("G1x5y5", this);} // tgen

static void Test_G1x5y5()
{
  extern Class_Descriptor cd_G1x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x5y5, buf);
    G1x5y5 *dp, &lv = *(dp=new (buf) G1x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y5)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,24), "G1x5y5");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,32), "G1x5y5");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(32,24), "G1x5y5");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(24,16), "G1x5y5");
    check_base_class_offset(lv, (E1x5*), ABISELECT(16,12), "G1x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x5y5.ff");
    test_class_info(&lv, &cd_G1x5y5);
    dp->~G1x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y5(Test_G1x5y5, "G1x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x5y5C1Ev();
extern void _ZN6G1x5y5D1Ev();
Name_Map name_map_G1x5y5[] = {
  NSPAIR(_ZN6G1x5y5C1Ev),
  NSPAIR(_ZN6G1x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G1x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y5[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y5[] = {
  {&(_ZTV6G1x5y5[4]),  4,11},
  {&(_ZTV6G1x5y5[7]),  7,11},
  {&(_ZTV6G1x5y5[10]),  10,11},
  {&(_tg__ZTV4E1x5__6G1x5y5[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x5y5[];
extern  VTBL_ENTRY _ZTV6G1x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y5[];
Class_Descriptor cd_G1x5y5 = {  "G1x5y5", // class name
  bases_G1x5y5, 6,
  &(vtc_G1x5y5[0]), // expected_vtbl_contents
  &(vtt_G1x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y6  : E1x5 , virtual F0 {
  int ff;
  ~G1x5y6(); // tgen
  G1x5y6(); // tgen
};
//SIG(1 G1x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x5y6 ::~G1x5y6(){ note_dtor("G1x5y6", this);} // tgen
G1x5y6 ::G1x5y6(){ note_ctor("G1x5y6", this);} // tgen

static void Test_G1x5y6()
{
  extern Class_Descriptor cd_G1x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x5y6, buf);
    G1x5y6 *dp, &lv = *(dp=new (buf) G1x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y6)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,16), "G1x5y6");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,24), "G1x5y6");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(24,16), "G1x5y6");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(8,4), "G1x5y6");
    check_base_class_offset(lv, (E1x5*), 0, "G1x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G1x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G1x5y6.ff");
    test_class_info(&lv, &cd_G1x5y6);
    dp->~G1x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y6(Test_G1x5y6, "G1x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x5y6C1Ev();
extern void _ZN6G1x5y6D1Ev();
Name_Map name_map_G1x5y6[] = {
  NSPAIR(_ZN6G1x5y6C1Ev),
  NSPAIR(_ZN6G1x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G1x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y6[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y6[] = {
  {&(_ZTV6G1x5y6[4]),  4,8},
  {&(_tg__ZTV4E1x5__6G1x5y6[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y6[3]),  3,4},
  {&(_ZTV6G1x5y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G1x5y6[];
extern  VTBL_ENTRY _ZTV6G1x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y6[];
Class_Descriptor cd_G1x5y6 = {  "G1x5y6", // class name
  bases_G1x5y6, 6,
  &(vtc_G1x5y6[0]), // expected_vtbl_contents
  &(vtt_G1x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x5y7  : virtual E1x5 , virtual F0 {
  int ff;
  ~G1x5y7(); // tgen
  G1x5y7(); // tgen
};
//SIG(1 G1x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x5y7 ::~G1x5y7(){ note_dtor("G1x5y7", this);} // tgen
G1x5y7 ::G1x5y7(){ note_ctor("G1x5y7", this);} // tgen

static void Test_G1x5y7()
{
  extern Class_Descriptor cd_G1x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x5y7, buf);
    G1x5y7 *dp, &lv = *(dp=new (buf) G1x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x5y7)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x5y7");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x5y7");
    check_base_class_offset(lv, (C1*)(E1x5*), ABISELECT(32,20), "G1x5y7");
    check_base_class_offset(lv, (D0*)(E1x5*), ABISELECT(24,12), "G1x5y7");
    check_base_class_offset(lv, (E1x5*), ABISELECT(16,8), "G1x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G1x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x5y7.ff");
    test_class_info(&lv, &cd_G1x5y7);
    dp->~G1x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x5y7(Test_G1x5y7, "G1x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x5y7C1Ev();
extern void _ZN6G1x5y7D1Ev();
Name_Map name_map_G1x5y7[] = {
  NSPAIR(_ZN6G1x5y7C1Ev),
  NSPAIR(_ZN6G1x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x5;
extern VTBL_ENTRY _ZTI4E1x5[];
extern  VTBL_ENTRY _ZTV4E1x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E1x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x5y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G1x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x5y7[];
static  VTBL_ENTRY _tg__ZTV4E1x5__6G1x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x5__6G1x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x5y7[] = {
  {&(_ZTV6G1x5y7[5]),  5,12},
  {&(_ZTV6G1x5y7[8]),  8,12},
  {&(_ZTV6G1x5y7[11]),  11,12},
  {&(_tg__ZTV4E1x5__6G1x5y7[3]),  3,3},
  {&(_tg__ZTV2A12C1__4E1x5__6G1x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x5y7[];
extern  VTBL_ENTRY _ZTV6G1x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x5y7[];
Class_Descriptor cd_G1x5y7 = {  "G1x5y7", // class name
  bases_G1x5y7, 6,
  &(vtc_G1x5y7[0]), // expected_vtbl_contents
  &(vtt_G1x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x5y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x5y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E2x5  : virtual C2 , D0 {
  int fd;
  ~E2x5(); // tgen
  E2x5(); // tgen
};
//SIG(-1 E2x5) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E2x5 ::~E2x5(){ note_dtor("E2x5", this);} // tgen
E2x5 ::E2x5(){ note_ctor("E2x5", this);} // tgen

static void Test_E2x5()
{
  extern Class_Descriptor cd_E2x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E2x5, buf);
    E2x5 *dp, &lv = *(dp=new (buf) E2x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E2x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x5)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,24), "E2x5");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,16), "E2x5");
    check_base_class_offset(lv, (C2*), ABISELECT(16,12), "E2x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E2x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E2x5.fd");
    test_class_info(&lv, &cd_E2x5);
    dp->~E2x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x5(Test_E2x5, "E2x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E2x5C1Ev();
extern void _ZN4E2x5D1Ev();
Name_Map name_map_E2x5[] = {
  NSPAIR(_ZN4E2x5C1Ev),
  NSPAIR(_ZN4E2x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E2x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E2x5[];
static  VTBL_ENTRY vtc_E2x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
extern VTBL_ENTRY _ZTV4E2x5[];
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x5[] = {
  {&(_ZTV4E2x5[4]),  4,7},
  {&(_ZTV4E2x5[7]),  7,7},
  {&(_tg__ZTV2C2__4E2x5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
Class_Descriptor cd_E2x5 = {  "E2x5", // class name
  bases_E2x5, 4,
  &(vtc_E2x5[0]), // expected_vtbl_contents
  &(vtt_E2x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E2x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E2x5),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E2x5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y0  : E2x5 , F1 {
  int ff;
  ~G2x5y0(); // tgen
  G2x5y0(); // tgen
};
//SIG(1 G2x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x5y0 ::~G2x5y0(){ note_dtor("G2x5y0", this);} // tgen
G2x5y0 ::G2x5y0(){ note_ctor("G2x5y0", this);} // tgen

static void Test_G2x5y0()
{
  extern Class_Descriptor cd_G2x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x5y0, buf);
    G2x5y0 *dp, &lv = *(dp=new (buf) G2x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y0)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,36), "G2x5y0");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,28), "G2x5y0");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(32,24), "G2x5y0");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(8,4), "G2x5y0");
    check_base_class_offset(lv, (E2x5*), 0, "G2x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G2x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G2x5y0.ff");
    test_class_info(&lv, &cd_G2x5y0);
    dp->~G2x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y0(Test_G2x5y0, "G2x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x5y0C1Ev();
extern void _ZN6G2x5y0D1Ev();
Name_Map name_map_G2x5y0[] = {
  NSPAIR(_ZN6G2x5y0C1Ev),
  NSPAIR(_ZN6G2x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G2x5y0[0]),
};
extern VTBL_ENTRY _ZTV6G2x5y0[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y0[] = {
  {&(_ZTV6G2x5y0[4]),  4,10},
  {&(_tg__ZTV4E2x5__6G2x5y0[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y0[3]),  3,3},
  {&(_ZTV6G2x5y0[10]),  10,10},
  {&(_tg__ZTV2C2__6G2x5y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y0[];
extern  VTBL_ENTRY _ZTV6G2x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y0[];
Class_Descriptor cd_G2x5y0 = {  "G2x5y0", // class name
  bases_G2x5y0, 6,
  &(vtc_G2x5y0[0]), // expected_vtbl_contents
  &(vtt_G2x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y0),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y1  : virtual E2x5 , F1 {
  int ff;
  ~G2x5y1(); // tgen
  G2x5y1(); // tgen
};
//SIG(1 G2x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x5y1 ::~G2x5y1(){ note_dtor("G2x5y1", this);} // tgen
G2x5y1 ::G2x5y1(){ note_ctor("G2x5y1", this);} // tgen

static void Test_G2x5y1()
{
  extern Class_Descriptor cd_G2x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x5y1, buf);
    G2x5y1 *dp, &lv = *(dp=new (buf) G2x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y1)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,36), "G2x5y1");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,28), "G2x5y1");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(32,24), "G2x5y1");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(24,16), "G2x5y1");
    check_base_class_offset(lv, (E2x5*), ABISELECT(16,12), "G2x5y1");
    check_base_class_offset(lv, (F1*), 0, "G2x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x5y1.ff");
    test_class_info(&lv, &cd_G2x5y1);
    dp->~G2x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y1(Test_G2x5y1, "G2x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x5y1C1Ev();
extern void _ZN6G2x5y1D1Ev();
Name_Map name_map_G2x5y1[] = {
  NSPAIR(_ZN6G2x5y1C1Ev),
  NSPAIR(_ZN6G2x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x5y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G2x5y1[0]),
};
extern VTBL_ENTRY _ZTV6G2x5y1[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y1[] = {
  {&(_ZTV6G2x5y1[5]),  5,13},
  {&(_ZTV6G2x5y1[10]),  10,13},
  {&(_ZTV6G2x5y1[13]),  13,13},
  {&(_tg__ZTV4E2x5__6G2x5y1[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y1[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x5y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y1[];
extern  VTBL_ENTRY _ZTV6G2x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y1[];
Class_Descriptor cd_G2x5y1 = {  "G2x5y1", // class name
  bases_G2x5y1, 6,
  &(vtc_G2x5y1[0]), // expected_vtbl_contents
  &(vtt_G2x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y1),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y2  : E2x5 , virtual F1 {
  int ff;
  ~G2x5y2(); // tgen
  G2x5y2(); // tgen
};
//SIG(1 G2x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x5y2 ::~G2x5y2(){ note_dtor("G2x5y2", this);} // tgen
G2x5y2 ::G2x5y2(){ note_ctor("G2x5y2", this);} // tgen

static void Test_G2x5y2()
{
  extern Class_Descriptor cd_G2x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x5y2, buf);
    G2x5y2 *dp, &lv = *(dp=new (buf) G2x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y2)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,28), "G2x5y2");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,20), "G2x5y2");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(24,16), "G2x5y2");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(8,4), "G2x5y2");
    check_base_class_offset(lv, (E2x5*), 0, "G2x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G2x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G2x5y2.ff");
    test_class_info(&lv, &cd_G2x5y2);
    dp->~G2x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y2(Test_G2x5y2, "G2x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G2x5y2C1Ev();
extern void _ZN6G2x5y2D1Ev();
Name_Map name_map_G2x5y2[] = {
  NSPAIR(_ZN6G2x5y2C1Ev),
  NSPAIR(_ZN6G2x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y2[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G2x5y2[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G2x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x5y2[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y2[] = {
  {&(_ZTV6G2x5y2[5]),  5,12},
  {&(_tg__ZTV4E2x5__6G2x5y2[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y2[3]),  3,3},
  {&(_ZTV6G2x5y2[8]),  8,12},
  {&(_ZTV6G2x5y2[11]),  11,12},
  {&(_tg__ZTV2C2__6G2x5y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y2[];
extern  VTBL_ENTRY _ZTV6G2x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y2[];
Class_Descriptor cd_G2x5y2 = {  "G2x5y2", // class name
  bases_G2x5y2, 6,
  &(vtc_G2x5y2[0]), // expected_vtbl_contents
  &(vtt_G2x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G2x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y2),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y3  : virtual E2x5 , virtual F1 {
  int ff;
  ~G2x5y3(); // tgen
  G2x5y3(); // tgen
};
//SIG(1 G2x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x5y3 ::~G2x5y3(){ note_dtor("G2x5y3", this);} // tgen
G2x5y3 ::G2x5y3(){ note_ctor("G2x5y3", this);} // tgen

static void Test_G2x5y3()
{
  extern Class_Descriptor cd_G2x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G2x5y3, buf);
    G2x5y3 *dp, &lv = *(dp=new (buf) G2x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G2x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y3)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x5y3");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x5y3");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(32,20), "G2x5y3");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(24,12), "G2x5y3");
    check_base_class_offset(lv, (E2x5*), ABISELECT(16,8), "G2x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G2x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x5y3.ff");
    test_class_info(&lv, &cd_G2x5y3);
    dp->~G2x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y3(Test_G2x5y3, "G2x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G2x5y3C1Ev();
extern void _ZN6G2x5y3D1Ev();
Name_Map name_map_G2x5y3[] = {
  NSPAIR(_ZN6G2x5y3C1Ev),
  NSPAIR(_ZN6G2x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G2x5y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G2x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x5y3[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y3[] = {
  {&(_ZTV6G2x5y3[6]),  6,17},
  {&(_ZTV6G2x5y3[10]),  10,17},
  {&(_ZTV6G2x5y3[13]),  13,17},
  {&(_ZTV6G2x5y3[16]),  16,17},
  {&(_tg__ZTV4E2x5__6G2x5y3[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y3[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x5y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y3[];
extern  VTBL_ENTRY _ZTV6G2x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y3[];
Class_Descriptor cd_G2x5y3 = {  "G2x5y3", // class name
  bases_G2x5y3, 6,
  &(vtc_G2x5y3[0]), // expected_vtbl_contents
  &(vtt_G2x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G2x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y3),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y4  : E2x5 , F0 {
  int ff;
  ~G2x5y4(); // tgen
  G2x5y4(); // tgen
};
//SIG(1 G2x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G2x5y4 ::~G2x5y4(){ note_dtor("G2x5y4", this);} // tgen
G2x5y4 ::G2x5y4(){ note_ctor("G2x5y4", this);} // tgen

static void Test_G2x5y4()
{
  extern Class_Descriptor cd_G2x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x5y4, buf);
    G2x5y4 *dp, &lv = *(dp=new (buf) G2x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y4)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,32), "G2x5y4");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,24), "G2x5y4");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(24,20), "G2x5y4");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(8,4), "G2x5y4");
    check_base_class_offset(lv, (E2x5*), 0, "G2x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G2x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G2x5y4.ff");
    test_class_info(&lv, &cd_G2x5y4);
    dp->~G2x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y4(Test_G2x5y4, "G2x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x5y4C1Ev();
extern void _ZN6G2x5y4D1Ev();
Name_Map name_map_G2x5y4[] = {
  NSPAIR(_ZN6G2x5y4C1Ev),
  NSPAIR(_ZN6G2x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y4[];
static  VTBL_ENTRY vtc_G2x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G2x5y4[0]),
};
extern VTBL_ENTRY _ZTV6G2x5y4[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y4[] = {
  {&(_ZTV6G2x5y4[4]),  4,7},
  {&(_tg__ZTV4E2x5__6G2x5y4[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y4[3]),  3,3},
  {&(_ZTV6G2x5y4[7]),  7,7},
  {&(_tg__ZTV2C2__6G2x5y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y4[];
extern  VTBL_ENTRY _ZTV6G2x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y4[];
Class_Descriptor cd_G2x5y4 = {  "G2x5y4", // class name
  bases_G2x5y4, 6,
  &(vtc_G2x5y4[0]), // expected_vtbl_contents
  &(vtt_G2x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y4),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y5  : virtual E2x5 , F0 {
  int ff;
  ~G2x5y5(); // tgen
  G2x5y5(); // tgen
};
//SIG(1 G2x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G2x5y5 ::~G2x5y5(){ note_dtor("G2x5y5", this);} // tgen
G2x5y5 ::G2x5y5(){ note_ctor("G2x5y5", this);} // tgen

static void Test_G2x5y5()
{
  extern Class_Descriptor cd_G2x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x5y5, buf);
    G2x5y5 *dp, &lv = *(dp=new (buf) G2x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y5)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,36), "G2x5y5");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,28), "G2x5y5");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(32,24), "G2x5y5");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(24,16), "G2x5y5");
    check_base_class_offset(lv, (E2x5*), ABISELECT(16,12), "G2x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x5y5.ff");
    test_class_info(&lv, &cd_G2x5y5);
    dp->~G2x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y5(Test_G2x5y5, "G2x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x5y5C1Ev();
extern void _ZN6G2x5y5D1Ev();
Name_Map name_map_G2x5y5[] = {
  NSPAIR(_ZN6G2x5y5C1Ev),
  NSPAIR(_ZN6G2x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y5[];
static  VTBL_ENTRY vtc_G2x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G2x5y5[0]),
};
extern VTBL_ENTRY _ZTV6G2x5y5[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y5[] = {
  {&(_ZTV6G2x5y5[5]),  5,12},
  {&(_ZTV6G2x5y5[9]),  9,12},
  {&(_ZTV6G2x5y5[12]),  12,12},
  {&(_tg__ZTV4E2x5__6G2x5y5[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y5[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x5y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y5[];
extern  VTBL_ENTRY _ZTV6G2x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y5[];
Class_Descriptor cd_G2x5y5 = {  "G2x5y5", // class name
  bases_G2x5y5, 6,
  &(vtc_G2x5y5[0]), // expected_vtbl_contents
  &(vtt_G2x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y5),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y6  : E2x5 , virtual F0 {
  int ff;
  ~G2x5y6(); // tgen
  G2x5y6(); // tgen
};
//SIG(1 G2x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x5y6 ::~G2x5y6(){ note_dtor("G2x5y6", this);} // tgen
G2x5y6 ::G2x5y6(){ note_ctor("G2x5y6", this);} // tgen

static void Test_G2x5y6()
{
  extern Class_Descriptor cd_G2x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x5y6, buf);
    G2x5y6 *dp, &lv = *(dp=new (buf) G2x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y6)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,28), "G2x5y6");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,20), "G2x5y6");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(24,16), "G2x5y6");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(8,4), "G2x5y6");
    check_base_class_offset(lv, (E2x5*), 0, "G2x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G2x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G2x5y6.ff");
    test_class_info(&lv, &cd_G2x5y6);
    dp->~G2x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y6(Test_G2x5y6, "G2x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x5y6C1Ev();
extern void _ZN6G2x5y6D1Ev();
Name_Map name_map_G2x5y6[] = {
  NSPAIR(_ZN6G2x5y6C1Ev),
  NSPAIR(_ZN6G2x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y6[];
static  VTBL_ENTRY vtc_G2x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y6[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G2x5y6[0]),
};
extern VTBL_ENTRY _ZTV6G2x5y6[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y6[] = {
  {&(_ZTV6G2x5y6[5]),  5,8},
  {&(_tg__ZTV4E2x5__6G2x5y6[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y6[3]),  3,3},
  {&(_ZTV6G2x5y6[8]),  8,8},
  {&(_tg__ZTV2C2__6G2x5y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y6[];
extern  VTBL_ENTRY _ZTV6G2x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y6[];
Class_Descriptor cd_G2x5y6 = {  "G2x5y6", // class name
  bases_G2x5y6, 6,
  &(vtc_G2x5y6[0]), // expected_vtbl_contents
  &(vtt_G2x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y6),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x5y7  : virtual E2x5 , virtual F0 {
  int ff;
  ~G2x5y7(); // tgen
  G2x5y7(); // tgen
};
//SIG(1 G2x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x5y7 ::~G2x5y7(){ note_dtor("G2x5y7", this);} // tgen
G2x5y7 ::G2x5y7(){ note_ctor("G2x5y7", this);} // tgen

static void Test_G2x5y7()
{
  extern Class_Descriptor cd_G2x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x5y7, buf);
    G2x5y7 *dp, &lv = *(dp=new (buf) G2x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x5y7)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x5y7");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x5y7");
    check_base_class_offset(lv, (C2*)(E2x5*), ABISELECT(32,20), "G2x5y7");
    check_base_class_offset(lv, (D0*)(E2x5*), ABISELECT(24,12), "G2x5y7");
    check_base_class_offset(lv, (E2x5*), ABISELECT(16,8), "G2x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G2x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x5y7.ff");
    test_class_info(&lv, &cd_G2x5y7);
    dp->~G2x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x5y7(Test_G2x5y7, "G2x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x5y7C1Ev();
extern void _ZN6G2x5y7D1Ev();
Name_Map name_map_G2x5y7[] = {
  NSPAIR(_ZN6G2x5y7C1Ev),
  NSPAIR(_ZN6G2x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x5;
extern VTBL_ENTRY _ZTI4E2x5[];
extern  VTBL_ENTRY _ZTV4E2x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E2x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x5y7[];
static  VTBL_ENTRY vtc_G2x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G2x5y7[0]),
};
extern VTBL_ENTRY _ZTV6G2x5y7[];
static  VTBL_ENTRY _tg__ZTV4E2x5__6G2x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x5__6G2x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x5y7[] = {
  {&(_ZTV6G2x5y7[6]),  6,13},
  {&(_ZTV6G2x5y7[10]),  10,13},
  {&(_ZTV6G2x5y7[13]),  13,13},
  {&(_tg__ZTV4E2x5__6G2x5y7[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x5__6G2x5y7[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x5y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x5y7[];
extern  VTBL_ENTRY _ZTV6G2x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x5y7[];
Class_Descriptor cd_G2x5y7 = {  "G2x5y7", // class name
  bases_G2x5y7, 6,
  &(vtc_G2x5y7[0]), // expected_vtbl_contents
  &(vtt_G2x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x5y7),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x5y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E3x5  : virtual C3 , D0 {
  int fd;
  ~E3x5(); // tgen
  E3x5(); // tgen
};
//SIG(-1 E3x5) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} BC5{ Fi} Fi}


E3x5 ::~E3x5(){ note_dtor("E3x5", this);} // tgen
E3x5 ::E3x5(){ note_ctor("E3x5", this);} // tgen

static void Test_E3x5()
{
  extern Class_Descriptor cd_E3x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E3x5, buf);
    E3x5 *dp, &lv = *(dp=new (buf) E3x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E3x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x5)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,24), "E3x5");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,16), "E3x5");
    check_base_class_offset(lv, (C3*), ABISELECT(16,12), "E3x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E3x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E3x5.fd");
    test_class_info(&lv, &cd_E3x5);
    dp->~E3x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x5(Test_E3x5, "E3x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN4E3x5C1Ev();
extern void _ZN4E3x5D1Ev();
Name_Map name_map_E3x5[] = {
  NSPAIR(_ZN4E3x5C1Ev),
  NSPAIR(_ZN4E3x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E3x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E3x5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E3x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E3x5[];
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__4E3x5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x5[] = {
  {&(_ZTV4E3x5[4]),  4,11},
  {&(_ZTV4E3x5[7]),  7,11},
  {&(_ZTV4E3x5[10]),  10,11},
  {&(_tg__ZTV2C3__4E3x5[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__4E3x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
Class_Descriptor cd_E3x5 = {  "E3x5", // class name
  bases_E3x5, 4,
  &(vtc_E3x5[0]), // expected_vtbl_contents
  &(vtt_E3x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI4E3x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E3x5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E3x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y0  : E3x5 , F1 {
  int ff;
  ~G3x5y0(); // tgen
  G3x5y0(); // tgen
};
//SIG(1 G3x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x5y0 ::~G3x5y0(){ note_dtor("G3x5y0", this);} // tgen
G3x5y0 ::G3x5y0(){ note_ctor("G3x5y0", this);} // tgen

static void Test_G3x5y0()
{
  extern Class_Descriptor cd_G3x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x5y0, buf);
    G3x5y0 *dp, &lv = *(dp=new (buf) G3x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y0)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,36), "G3x5y0");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,28), "G3x5y0");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(32,24), "G3x5y0");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(8,4), "G3x5y0");
    check_base_class_offset(lv, (E3x5*), 0, "G3x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G3x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G3x5y0.ff");
    test_class_info(&lv, &cd_G3x5y0);
    dp->~G3x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y0(Test_G3x5y0, "G3x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x5y0C1Ev();
extern void _ZN6G3x5y0D1Ev();
Name_Map name_map_G3x5y0[] = {
  NSPAIR(_ZN6G3x5y0C1Ev),
  NSPAIR(_ZN6G3x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x5y0[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G3x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y0[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y0[] = {
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y0[] = {
  {&(_ZTV6G3x5y0[4]),  4,14},
  {&(_tg__ZTV4E3x5__6G3x5y0[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y0[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y0[3]),  3,4},
  {&(_ZTV6G3x5y0[10]),  10,14},
  {&(_ZTV6G3x5y0[13]),  13,14},
  {&(_tg__ZTV2C3__6G3x5y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y0[];
extern  VTBL_ENTRY _ZTV6G3x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y0[];
Class_Descriptor cd_G3x5y0 = {  "G3x5y0", // class name
  bases_G3x5y0, 6,
  &(vtc_G3x5y0[0]), // expected_vtbl_contents
  &(vtt_G3x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y0),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y1  : virtual E3x5 , F1 {
  int ff;
  ~G3x5y1(); // tgen
  G3x5y1(); // tgen
};
//SIG(1 G3x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x5y1 ::~G3x5y1(){ note_dtor("G3x5y1", this);} // tgen
G3x5y1 ::G3x5y1(){ note_ctor("G3x5y1", this);} // tgen

static void Test_G3x5y1()
{
  extern Class_Descriptor cd_G3x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x5y1, buf);
    G3x5y1 *dp, &lv = *(dp=new (buf) G3x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y1)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,36), "G3x5y1");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,28), "G3x5y1");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(32,24), "G3x5y1");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(24,16), "G3x5y1");
    check_base_class_offset(lv, (E3x5*), ABISELECT(16,12), "G3x5y1");
    check_base_class_offset(lv, (F1*), 0, "G3x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x5y1.ff");
    test_class_info(&lv, &cd_G3x5y1);
    dp->~G3x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y1(Test_G3x5y1, "G3x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x5y1C1Ev();
extern void _ZN6G3x5y1D1Ev();
Name_Map name_map_G3x5y1[] = {
  NSPAIR(_ZN6G3x5y1C1Ev),
  NSPAIR(_ZN6G3x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x5y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x5y1[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G3x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y1[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y1[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y1[] = {
  {&(_ZTV6G3x5y1[5]),  5,17},
  {&(_ZTV6G3x5y1[10]),  10,17},
  {&(_ZTV6G3x5y1[13]),  13,17},
  {&(_ZTV6G3x5y1[16]),  16,17},
  {&(_tg__ZTV4E3x5__6G3x5y1[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y1[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y1[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x5y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y1[];
extern  VTBL_ENTRY _ZTV6G3x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y1[];
Class_Descriptor cd_G3x5y1 = {  "G3x5y1", // class name
  bases_G3x5y1, 6,
  &(vtc_G3x5y1[0]), // expected_vtbl_contents
  &(vtt_G3x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y2  : E3x5 , virtual F1 {
  int ff;
  ~G3x5y2(); // tgen
  G3x5y2(); // tgen
};
//SIG(1 G3x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x5y2 ::~G3x5y2(){ note_dtor("G3x5y2", this);} // tgen
G3x5y2 ::G3x5y2(){ note_ctor("G3x5y2", this);} // tgen

static void Test_G3x5y2()
{
  extern Class_Descriptor cd_G3x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x5y2, buf);
    G3x5y2 *dp, &lv = *(dp=new (buf) G3x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y2)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,28), "G3x5y2");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,20), "G3x5y2");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(24,16), "G3x5y2");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(8,4), "G3x5y2");
    check_base_class_offset(lv, (E3x5*), 0, "G3x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G3x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G3x5y2.ff");
    test_class_info(&lv, &cd_G3x5y2);
    dp->~G3x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y2(Test_G3x5y2, "G3x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G3x5y2C1Ev();
extern void _ZN6G3x5y2D1Ev();
Name_Map name_map_G3x5y2[] = {
  NSPAIR(_ZN6G3x5y2C1Ev),
  NSPAIR(_ZN6G3x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y2[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G3x5y2[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G3x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y2[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y2[] = {
  {&(_ZTV6G3x5y2[5]),  5,16},
  {&(_tg__ZTV4E3x5__6G3x5y2[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y2[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y2[3]),  3,4},
  {&(_ZTV6G3x5y2[8]),  8,16},
  {&(_ZTV6G3x5y2[11]),  11,16},
  {&(_ZTV6G3x5y2[15]),  15,16},
  {&(_tg__ZTV2C3__6G3x5y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y2[];
extern  VTBL_ENTRY _ZTV6G3x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y2[];
Class_Descriptor cd_G3x5y2 = {  "G3x5y2", // class name
  bases_G3x5y2, 6,
  &(vtc_G3x5y2[0]), // expected_vtbl_contents
  &(vtt_G3x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G3x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y2),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y3  : virtual E3x5 , virtual F1 {
  int ff;
  ~G3x5y3(); // tgen
  G3x5y3(); // tgen
};
//SIG(1 G3x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x5y3 ::~G3x5y3(){ note_dtor("G3x5y3", this);} // tgen
G3x5y3 ::G3x5y3(){ note_ctor("G3x5y3", this);} // tgen

static void Test_G3x5y3()
{
  extern Class_Descriptor cd_G3x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G3x5y3, buf);
    G3x5y3 *dp, &lv = *(dp=new (buf) G3x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G3x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y3)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x5y3");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x5y3");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(32,20), "G3x5y3");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(24,12), "G3x5y3");
    check_base_class_offset(lv, (E3x5*), ABISELECT(16,8), "G3x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G3x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x5y3.ff");
    test_class_info(&lv, &cd_G3x5y3);
    dp->~G3x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y3(Test_G3x5y3, "G3x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN6G3x5y3C1Ev();
extern void _ZN6G3x5y3D1Ev();
Name_Map name_map_G3x5y3[] = {
  NSPAIR(_ZN6G3x5y3C1Ev),
  NSPAIR(_ZN6G3x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G3x5y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G3x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6G3x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y3[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y3[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y3[] = {
  {&(_ZTV6G3x5y3[6]),  6,21},
  {&(_ZTV6G3x5y3[10]),  10,21},
  {&(_ZTV6G3x5y3[13]),  13,21},
  {&(_ZTV6G3x5y3[16]),  16,21},
  {&(_ZTV6G3x5y3[20]),  20,21},
  {&(_tg__ZTV4E3x5__6G3x5y3[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y3[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y3[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x5y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y3[];
extern  VTBL_ENTRY _ZTV6G3x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y3[];
Class_Descriptor cd_G3x5y3 = {  "G3x5y3", // class name
  bases_G3x5y3, 6,
  &(vtc_G3x5y3[0]), // expected_vtbl_contents
  &(vtt_G3x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI6G3x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y4  : E3x5 , F0 {
  int ff;
  ~G3x5y4(); // tgen
  G3x5y4(); // tgen
};
//SIG(1 G3x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G3x5y4 ::~G3x5y4(){ note_dtor("G3x5y4", this);} // tgen
G3x5y4 ::G3x5y4(){ note_ctor("G3x5y4", this);} // tgen

static void Test_G3x5y4()
{
  extern Class_Descriptor cd_G3x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x5y4, buf);
    G3x5y4 *dp, &lv = *(dp=new (buf) G3x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y4)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,32), "G3x5y4");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,24), "G3x5y4");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(24,20), "G3x5y4");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(8,4), "G3x5y4");
    check_base_class_offset(lv, (E3x5*), 0, "G3x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G3x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G3x5y4.ff");
    test_class_info(&lv, &cd_G3x5y4);
    dp->~G3x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y4(Test_G3x5y4, "G3x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x5y4C1Ev();
extern void _ZN6G3x5y4D1Ev();
Name_Map name_map_G3x5y4[] = {
  NSPAIR(_ZN6G3x5y4C1Ev),
  NSPAIR(_ZN6G3x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G3x5y4[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G3x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y4[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y4[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y4[] = {
  {&(_ZTV6G3x5y4[4]),  4,11},
  {&(_tg__ZTV4E3x5__6G3x5y4[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y4[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y4[3]),  3,4},
  {&(_ZTV6G3x5y4[7]),  7,11},
  {&(_ZTV6G3x5y4[10]),  10,11},
  {&(_tg__ZTV2C3__6G3x5y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y4[];
extern  VTBL_ENTRY _ZTV6G3x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y4[];
Class_Descriptor cd_G3x5y4 = {  "G3x5y4", // class name
  bases_G3x5y4, 6,
  &(vtc_G3x5y4[0]), // expected_vtbl_contents
  &(vtt_G3x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y4),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y5  : virtual E3x5 , F0 {
  int ff;
  ~G3x5y5(); // tgen
  G3x5y5(); // tgen
};
//SIG(1 G3x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G3x5y5 ::~G3x5y5(){ note_dtor("G3x5y5", this);} // tgen
G3x5y5 ::G3x5y5(){ note_ctor("G3x5y5", this);} // tgen

static void Test_G3x5y5()
{
  extern Class_Descriptor cd_G3x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x5y5, buf);
    G3x5y5 *dp, &lv = *(dp=new (buf) G3x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y5)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,36), "G3x5y5");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,28), "G3x5y5");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(32,24), "G3x5y5");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(24,16), "G3x5y5");
    check_base_class_offset(lv, (E3x5*), ABISELECT(16,12), "G3x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x5y5.ff");
    test_class_info(&lv, &cd_G3x5y5);
    dp->~G3x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y5(Test_G3x5y5, "G3x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x5y5C1Ev();
extern void _ZN6G3x5y5D1Ev();
Name_Map name_map_G3x5y5[] = {
  NSPAIR(_ZN6G3x5y5C1Ev),
  NSPAIR(_ZN6G3x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x5y5[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G3x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y5[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y5[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y5[] = {
  {&(_ZTV6G3x5y5[5]),  5,16},
  {&(_ZTV6G3x5y5[9]),  9,16},
  {&(_ZTV6G3x5y5[12]),  12,16},
  {&(_ZTV6G3x5y5[15]),  15,16},
  {&(_tg__ZTV4E3x5__6G3x5y5[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y5[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y5[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x5y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y5[];
extern  VTBL_ENTRY _ZTV6G3x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y5[];
Class_Descriptor cd_G3x5y5 = {  "G3x5y5", // class name
  bases_G3x5y5, 6,
  &(vtc_G3x5y5[0]), // expected_vtbl_contents
  &(vtt_G3x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y6  : E3x5 , virtual F0 {
  int ff;
  ~G3x5y6(); // tgen
  G3x5y6(); // tgen
};
//SIG(1 G3x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x5y6 ::~G3x5y6(){ note_dtor("G3x5y6", this);} // tgen
G3x5y6 ::G3x5y6(){ note_ctor("G3x5y6", this);} // tgen

static void Test_G3x5y6()
{
  extern Class_Descriptor cd_G3x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x5y6, buf);
    G3x5y6 *dp, &lv = *(dp=new (buf) G3x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y6)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,28), "G3x5y6");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,20), "G3x5y6");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(24,16), "G3x5y6");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(8,4), "G3x5y6");
    check_base_class_offset(lv, (E3x5*), 0, "G3x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G3x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G3x5y6.ff");
    test_class_info(&lv, &cd_G3x5y6);
    dp->~G3x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y6(Test_G3x5y6, "G3x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x5y6C1Ev();
extern void _ZN6G3x5y6D1Ev();
Name_Map name_map_G3x5y6[] = {
  NSPAIR(_ZN6G3x5y6C1Ev),
  NSPAIR(_ZN6G3x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y6[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G3x5y6[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y6[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y6[] = {
  {&(_ZTV6G3x5y6[5]),  5,12},
  {&(_tg__ZTV4E3x5__6G3x5y6[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y6[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y6[3]),  3,4},
  {&(_ZTV6G3x5y6[8]),  8,12},
  {&(_ZTV6G3x5y6[11]),  11,12},
  {&(_tg__ZTV2C3__6G3x5y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y6[];
extern  VTBL_ENTRY _ZTV6G3x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y6[];
Class_Descriptor cd_G3x5y6 = {  "G3x5y6", // class name
  bases_G3x5y6, 6,
  &(vtc_G3x5y6[0]), // expected_vtbl_contents
  &(vtt_G3x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y6),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x5y7  : virtual E3x5 , virtual F0 {
  int ff;
  ~G3x5y7(); // tgen
  G3x5y7(); // tgen
};
//SIG(1 G3x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x5y7 ::~G3x5y7(){ note_dtor("G3x5y7", this);} // tgen
G3x5y7 ::G3x5y7(){ note_ctor("G3x5y7", this);} // tgen

static void Test_G3x5y7()
{
  extern Class_Descriptor cd_G3x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x5y7, buf);
    G3x5y7 *dp, &lv = *(dp=new (buf) G3x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x5y7)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x5y7");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x5y7");
    check_base_class_offset(lv, (C3*)(E3x5*), ABISELECT(32,20), "G3x5y7");
    check_base_class_offset(lv, (D0*)(E3x5*), ABISELECT(24,12), "G3x5y7");
    check_base_class_offset(lv, (E3x5*), ABISELECT(16,8), "G3x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G3x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x5y7.ff");
    test_class_info(&lv, &cd_G3x5y7);
    dp->~G3x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x5y7(Test_G3x5y7, "G3x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x5y7C1Ev();
extern void _ZN6G3x5y7D1Ev();
Name_Map name_map_G3x5y7[] = {
  NSPAIR(_ZN6G3x5y7C1Ev),
  NSPAIR(_ZN6G3x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x5;
extern VTBL_ENTRY _ZTI4E3x5[];
extern  VTBL_ENTRY _ZTV4E3x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E3x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x5y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G3x5y7[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G3x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x5y7[];
static  VTBL_ENTRY _tg__ZTV4E3x5__6G3x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x5__6G3x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x5__6G3x5y7[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x5y7[] = {
  {&(_ZTV6G3x5y7[6]),  6,17},
  {&(_ZTV6G3x5y7[10]),  10,17},
  {&(_ZTV6G3x5y7[13]),  13,17},
  {&(_ZTV6G3x5y7[16]),  16,17},
  {&(_tg__ZTV4E3x5__6G3x5y7[4]),  4,4},
  {&(_tg__ZTV2C3__4E3x5__6G3x5y7[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x5__6G3x5y7[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x5y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x5y7[];
extern  VTBL_ENTRY _ZTV6G3x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x5y7[];
Class_Descriptor cd_G3x5y7 = {  "G3x5y7", // class name
  bases_G3x5y7, 6,
  &(vtc_G3x5y7[0]), // expected_vtbl_contents
  &(vtt_G3x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x5y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x5  : virtual C4 , D0 {
  int fd;
  ~E4x5(); // tgen
  E4x5(); // tgen
};
//SIG(-1 E4x5) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E4x5 ::~E4x5(){ note_dtor("E4x5", this);} // tgen
E4x5 ::E4x5(){ note_ctor("E4x5", this);} // tgen

static void Test_E4x5()
{
  extern Class_Descriptor cd_E4x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E4x5, buf);
    E4x5 *dp, &lv = *(dp=new (buf) E4x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E4x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x5)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,20), "E4x5");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,12), "E4x5");
    check_base_class_offset(lv, (C4*), ABISELECT(16,12), "E4x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E4x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E4x5.fd");
    test_class_info(&lv, &cd_E4x5);
    dp->~E4x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x5(Test_E4x5, "E4x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E4x5C1Ev();
extern void _ZN4E4x5D1Ev();
Name_Map name_map_E4x5[] = {
  NSPAIR(_ZN4E4x5C1Ev),
  NSPAIR(_ZN4E4x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E4x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E4x5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E4x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E4x5[];
static  VTT_ENTRY vtt_E4x5[] = {
  {&(_ZTV4E4x5[3]),  3,7},
  {&(_ZTV4E4x5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
Class_Descriptor cd_E4x5 = {  "E4x5", // class name
  bases_E4x5, 4,
  &(vtc_E4x5[0]), // expected_vtbl_contents
  &(vtt_E4x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E4x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E4x5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E4x5),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y0  : E4x5 , F1 {
  int ff;
  ~G4x5y0(); // tgen
  G4x5y0(); // tgen
};
//SIG(1 G4x5y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x5y0 ::~G4x5y0(){ note_dtor("G4x5y0", this);} // tgen
G4x5y0 ::G4x5y0(){ note_ctor("G4x5y0", this);} // tgen

static void Test_G4x5y0()
{
  extern Class_Descriptor cd_G4x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x5y0, buf);
    G4x5y0 *dp, &lv = *(dp=new (buf) G4x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y0)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,32), "G4x5y0");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,24), "G4x5y0");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(32,24), "G4x5y0");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(8,4), "G4x5y0");
    check_base_class_offset(lv, (E4x5*), 0, "G4x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G4x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G4x5y0.ff");
    test_class_info(&lv, &cd_G4x5y0);
    dp->~G4x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y0(Test_G4x5y0, "G4x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x5y0C1Ev();
extern void _ZN6G4x5y0D1Ev();
Name_Map name_map_G4x5y0[] = {
  NSPAIR(_ZN6G4x5y0C1Ev),
  NSPAIR(_ZN6G4x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G4x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y0[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y0[] = {
  {&(_ZTV6G4x5y0[3]),  3,10},
  {&(_tg__ZTV4E4x5__6G4x5y0[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y0[3]),  3,4},
  {&(_ZTV6G4x5y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G4x5y0[];
extern  VTBL_ENTRY _ZTV6G4x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y0[];
Class_Descriptor cd_G4x5y0 = {  "G4x5y0", // class name
  bases_G4x5y0, 6,
  &(vtc_G4x5y0[0]), // expected_vtbl_contents
  &(vtt_G4x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y1  : virtual E4x5 , F1 {
  int ff;
  ~G4x5y1(); // tgen
  G4x5y1(); // tgen
};
//SIG(1 G4x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x5y1 ::~G4x5y1(){ note_dtor("G4x5y1", this);} // tgen
G4x5y1 ::G4x5y1(){ note_ctor("G4x5y1", this);} // tgen

static void Test_G4x5y1()
{
  extern Class_Descriptor cd_G4x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x5y1, buf);
    G4x5y1 *dp, &lv = *(dp=new (buf) G4x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y1)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,32), "G4x5y1");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,24), "G4x5y1");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(32,24), "G4x5y1");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(24,16), "G4x5y1");
    check_base_class_offset(lv, (E4x5*), ABISELECT(16,12), "G4x5y1");
    check_base_class_offset(lv, (F1*), 0, "G4x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x5y1.ff");
    test_class_info(&lv, &cd_G4x5y1);
    dp->~G4x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y1(Test_G4x5y1, "G4x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x5y1C1Ev();
extern void _ZN6G4x5y1D1Ev();
Name_Map name_map_G4x5y1[] = {
  NSPAIR(_ZN6G4x5y1C1Ev),
  NSPAIR(_ZN6G4x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G4x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y1[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y1[] = {
  {&(_ZTV6G4x5y1[4]),  4,12},
  {&(_ZTV6G4x5y1[8]),  8,12},
  {&(_ZTV6G4x5y1[11]),  11,12},
  {&(_tg__ZTV4E4x5__6G4x5y1[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x5y1[];
extern  VTBL_ENTRY _ZTV6G4x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y1[];
Class_Descriptor cd_G4x5y1 = {  "G4x5y1", // class name
  bases_G4x5y1, 6,
  &(vtc_G4x5y1[0]), // expected_vtbl_contents
  &(vtt_G4x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y2  : E4x5 , virtual F1 {
  int ff;
  ~G4x5y2(); // tgen
  G4x5y2(); // tgen
};
//SIG(1 G4x5y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x5y2 ::~G4x5y2(){ note_dtor("G4x5y2", this);} // tgen
G4x5y2 ::G4x5y2(){ note_ctor("G4x5y2", this);} // tgen

static void Test_G4x5y2()
{
  extern Class_Descriptor cd_G4x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x5y2, buf);
    G4x5y2 *dp, &lv = *(dp=new (buf) G4x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y2)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,24), "G4x5y2");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,16), "G4x5y2");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(24,16), "G4x5y2");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(8,4), "G4x5y2");
    check_base_class_offset(lv, (E4x5*), 0, "G4x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G4x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G4x5y2.ff");
    test_class_info(&lv, &cd_G4x5y2);
    dp->~G4x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y2(Test_G4x5y2, "G4x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G4x5y2C1Ev();
extern void _ZN6G4x5y2D1Ev();
Name_Map name_map_G4x5y2[] = {
  NSPAIR(_ZN6G4x5y2C1Ev),
  NSPAIR(_ZN6G4x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G4x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G4x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y2[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y2[] = {
  {&(_ZTV6G4x5y2[4]),  4,12},
  {&(_tg__ZTV4E4x5__6G4x5y2[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y2[3]),  3,4},
  {&(_ZTV6G4x5y2[7]),  7,12},
  {&(_ZTV6G4x5y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G4x5y2[];
extern  VTBL_ENTRY _ZTV6G4x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y2[];
Class_Descriptor cd_G4x5y2 = {  "G4x5y2", // class name
  bases_G4x5y2, 6,
  &(vtc_G4x5y2[0]), // expected_vtbl_contents
  &(vtt_G4x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G4x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y3  : virtual E4x5 , virtual F1 {
  int ff;
  ~G4x5y3(); // tgen
  G4x5y3(); // tgen
};
//SIG(1 G4x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x5y3 ::~G4x5y3(){ note_dtor("G4x5y3", this);} // tgen
G4x5y3 ::G4x5y3(){ note_ctor("G4x5y3", this);} // tgen

static void Test_G4x5y3()
{
  extern Class_Descriptor cd_G4x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G4x5y3, buf);
    G4x5y3 *dp, &lv = *(dp=new (buf) G4x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G4x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y3)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x5y3");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x5y3");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(32,20), "G4x5y3");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(24,12), "G4x5y3");
    check_base_class_offset(lv, (E4x5*), ABISELECT(16,8), "G4x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G4x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x5y3.ff");
    test_class_info(&lv, &cd_G4x5y3);
    dp->~G4x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y3(Test_G4x5y3, "G4x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G4x5y3C1Ev();
extern void _ZN6G4x5y3D1Ev();
Name_Map name_map_G4x5y3[] = {
  NSPAIR(_ZN6G4x5y3C1Ev),
  NSPAIR(_ZN6G4x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G4x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G4x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y3[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y3[] = {
  {&(_ZTV6G4x5y3[5]),  5,16},
  {&(_ZTV6G4x5y3[8]),  8,16},
  {&(_ZTV6G4x5y3[11]),  11,16},
  {&(_ZTV6G4x5y3[15]),  15,16},
  {&(_tg__ZTV4E4x5__6G4x5y3[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x5y3[];
extern  VTBL_ENTRY _ZTV6G4x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y3[];
Class_Descriptor cd_G4x5y3 = {  "G4x5y3", // class name
  bases_G4x5y3, 6,
  &(vtc_G4x5y3[0]), // expected_vtbl_contents
  &(vtt_G4x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G4x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y4  : E4x5 , F0 {
  int ff;
  ~G4x5y4(); // tgen
  G4x5y4(); // tgen
};
//SIG(1 G4x5y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G4x5y4 ::~G4x5y4(){ note_dtor("G4x5y4", this);} // tgen
G4x5y4 ::G4x5y4(){ note_ctor("G4x5y4", this);} // tgen

static void Test_G4x5y4()
{
  extern Class_Descriptor cd_G4x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x5y4, buf);
    G4x5y4 *dp, &lv = *(dp=new (buf) G4x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y4)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,28), "G4x5y4");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,20), "G4x5y4");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(24,20), "G4x5y4");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(8,4), "G4x5y4");
    check_base_class_offset(lv, (E4x5*), 0, "G4x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G4x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G4x5y4.ff");
    test_class_info(&lv, &cd_G4x5y4);
    dp->~G4x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y4(Test_G4x5y4, "G4x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x5y4C1Ev();
extern void _ZN6G4x5y4D1Ev();
Name_Map name_map_G4x5y4[] = {
  NSPAIR(_ZN6G4x5y4C1Ev),
  NSPAIR(_ZN6G4x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G4x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y4[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y4[] = {
  {&(_ZTV6G4x5y4[3]),  3,7},
  {&(_tg__ZTV4E4x5__6G4x5y4[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y4[3]),  3,4},
  {&(_ZTV6G4x5y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI6G4x5y4[];
extern  VTBL_ENTRY _ZTV6G4x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y4[];
Class_Descriptor cd_G4x5y4 = {  "G4x5y4", // class name
  bases_G4x5y4, 6,
  &(vtc_G4x5y4[0]), // expected_vtbl_contents
  &(vtt_G4x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y5  : virtual E4x5 , F0 {
  int ff;
  ~G4x5y5(); // tgen
  G4x5y5(); // tgen
};
//SIG(1 G4x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G4x5y5 ::~G4x5y5(){ note_dtor("G4x5y5", this);} // tgen
G4x5y5 ::G4x5y5(){ note_ctor("G4x5y5", this);} // tgen

static void Test_G4x5y5()
{
  extern Class_Descriptor cd_G4x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x5y5, buf);
    G4x5y5 *dp, &lv = *(dp=new (buf) G4x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y5)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,32), "G4x5y5");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,24), "G4x5y5");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(32,24), "G4x5y5");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(24,16), "G4x5y5");
    check_base_class_offset(lv, (E4x5*), ABISELECT(16,12), "G4x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x5y5.ff");
    test_class_info(&lv, &cd_G4x5y5);
    dp->~G4x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y5(Test_G4x5y5, "G4x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x5y5C1Ev();
extern void _ZN6G4x5y5D1Ev();
Name_Map name_map_G4x5y5[] = {
  NSPAIR(_ZN6G4x5y5C1Ev),
  NSPAIR(_ZN6G4x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G4x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y5[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y5[] = {
  {&(_ZTV6G4x5y5[4]),  4,11},
  {&(_ZTV6G4x5y5[7]),  7,11},
  {&(_ZTV6G4x5y5[10]),  10,11},
  {&(_tg__ZTV4E4x5__6G4x5y5[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x5y5[];
extern  VTBL_ENTRY _ZTV6G4x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y5[];
Class_Descriptor cd_G4x5y5 = {  "G4x5y5", // class name
  bases_G4x5y5, 6,
  &(vtc_G4x5y5[0]), // expected_vtbl_contents
  &(vtt_G4x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y6  : E4x5 , virtual F0 {
  int ff;
  ~G4x5y6(); // tgen
  G4x5y6(); // tgen
};
//SIG(1 G4x5y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x5y6 ::~G4x5y6(){ note_dtor("G4x5y6", this);} // tgen
G4x5y6 ::G4x5y6(){ note_ctor("G4x5y6", this);} // tgen

static void Test_G4x5y6()
{
  extern Class_Descriptor cd_G4x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x5y6, buf);
    G4x5y6 *dp, &lv = *(dp=new (buf) G4x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y6)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,24), "G4x5y6");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,16), "G4x5y6");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(24,16), "G4x5y6");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(8,4), "G4x5y6");
    check_base_class_offset(lv, (E4x5*), 0, "G4x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G4x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G4x5y6.ff");
    test_class_info(&lv, &cd_G4x5y6);
    dp->~G4x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y6(Test_G4x5y6, "G4x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x5y6C1Ev();
extern void _ZN6G4x5y6D1Ev();
Name_Map name_map_G4x5y6[] = {
  NSPAIR(_ZN6G4x5y6C1Ev),
  NSPAIR(_ZN6G4x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G4x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y6[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y6[] = {
  {&(_ZTV6G4x5y6[4]),  4,8},
  {&(_tg__ZTV4E4x5__6G4x5y6[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y6[3]),  3,4},
  {&(_ZTV6G4x5y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G4x5y6[];
extern  VTBL_ENTRY _ZTV6G4x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y6[];
Class_Descriptor cd_G4x5y6 = {  "G4x5y6", // class name
  bases_G4x5y6, 6,
  &(vtc_G4x5y6[0]), // expected_vtbl_contents
  &(vtt_G4x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x5y7  : virtual E4x5 , virtual F0 {
  int ff;
  ~G4x5y7(); // tgen
  G4x5y7(); // tgen
};
//SIG(1 G4x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x5y7 ::~G4x5y7(){ note_dtor("G4x5y7", this);} // tgen
G4x5y7 ::G4x5y7(){ note_ctor("G4x5y7", this);} // tgen

static void Test_G4x5y7()
{
  extern Class_Descriptor cd_G4x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x5y7, buf);
    G4x5y7 *dp, &lv = *(dp=new (buf) G4x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x5y7)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x5y7");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x5y7");
    check_base_class_offset(lv, (C4*)(E4x5*), ABISELECT(32,20), "G4x5y7");
    check_base_class_offset(lv, (D0*)(E4x5*), ABISELECT(24,12), "G4x5y7");
    check_base_class_offset(lv, (E4x5*), ABISELECT(16,8), "G4x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G4x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x5y7.ff");
    test_class_info(&lv, &cd_G4x5y7);
    dp->~G4x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x5y7(Test_G4x5y7, "G4x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x5y7C1Ev();
extern void _ZN6G4x5y7D1Ev();
Name_Map name_map_G4x5y7[] = {
  NSPAIR(_ZN6G4x5y7C1Ev),
  NSPAIR(_ZN6G4x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x5;
extern VTBL_ENTRY _ZTI4E4x5[];
extern  VTBL_ENTRY _ZTV4E4x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E4x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x5y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G4x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x5y7[];
static  VTBL_ENTRY _tg__ZTV4E4x5__6G4x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x5__6G4x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x5y7[] = {
  {&(_ZTV6G4x5y7[5]),  5,12},
  {&(_ZTV6G4x5y7[8]),  8,12},
  {&(_ZTV6G4x5y7[11]),  11,12},
  {&(_tg__ZTV4E4x5__6G4x5y7[3]),  3,3},
  {&(_tg__ZTV2B12C4__4E4x5__6G4x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x5y7[];
extern  VTBL_ENTRY _ZTV6G4x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x5y7[];
Class_Descriptor cd_G4x5y7 = {  "G4x5y7", // class name
  bases_G4x5y7, 6,
  &(vtc_G4x5y7[0]), // expected_vtbl_contents
  &(vtt_G4x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x5y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x5y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E5x5  : virtual C5 , D0 {
  int fd;
  ~E5x5(); // tgen
  E5x5(); // tgen
};
//SIG(-1 E5x5) C1{ VBC2{ BC3{ v1 Fi} BC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E5x5 ::~E5x5(){ note_dtor("E5x5", this);} // tgen
E5x5 ::E5x5(){ note_ctor("E5x5", this);} // tgen

static void Test_E5x5()
{
  extern Class_Descriptor cd_E5x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E5x5, buf);
    E5x5 *dp, &lv = *(dp=new (buf) E5x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E5x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x5)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,12), "E5x5");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,20), "E5x5");
    check_base_class_offset(lv, (C5*), ABISELECT(16,12), "E5x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E5x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E5x5.fd");
    test_class_info(&lv, &cd_E5x5);
    dp->~E5x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x5(Test_E5x5, "E5x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN4E5x5C1Ev();
extern void _ZN4E5x5D1Ev();
Name_Map name_map_E5x5[] = {
  NSPAIR(_ZN4E5x5C1Ev),
  NSPAIR(_ZN4E5x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E5x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E5x5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E5x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E5x5[];
static  VTT_ENTRY vtt_E5x5[] = {
  {&(_ZTV4E5x5[3]),  3,10},
  {&(_ZTV4E5x5[6]),  6,10},
  {&(_ZTV4E5x5[9]),  9,10},
};
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
Class_Descriptor cd_E5x5 = {  "E5x5", // class name
  bases_E5x5, 4,
  &(vtc_E5x5[0]), // expected_vtbl_contents
  &(vtt_E5x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI4E5x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E5x5),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E5x5),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y0  : E5x5 , F1 {
  int ff;
  ~G5x5y0(); // tgen
  G5x5y0(); // tgen
};
//SIG(1 G5x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x5y0 ::~G5x5y0(){ note_dtor("G5x5y0", this);} // tgen
G5x5y0 ::G5x5y0(){ note_ctor("G5x5y0", this);} // tgen

static void Test_G5x5y0()
{
  extern Class_Descriptor cd_G5x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G5x5y0, buf);
    G5x5y0 *dp, &lv = *(dp=new (buf) G5x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G5x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y0)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,24), "G5x5y0");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,32), "G5x5y0");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(32,24), "G5x5y0");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(8,4), "G5x5y0");
    check_base_class_offset(lv, (E5x5*), 0, "G5x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G5x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G5x5y0.ff");
    test_class_info(&lv, &cd_G5x5y0);
    dp->~G5x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y0(Test_G5x5y0, "G5x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G5x5y0C1Ev();
extern void _ZN6G5x5y0D1Ev();
Name_Map name_map_G5x5y0[] = {
  NSPAIR(_ZN6G5x5y0C1Ev),
  NSPAIR(_ZN6G5x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G5x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G5x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y0[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y0[] = {
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y0[] = {
  {&(_ZTV6G5x5y0[3]),  3,13},
  {&(_tg__ZTV4E5x5__6G5x5y0[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y0[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y0[2]),  2,3},
  {&(_ZTV6G5x5y0[9]),  9,13},
  {&(_ZTV6G5x5y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6G5x5y0[];
extern  VTBL_ENTRY _ZTV6G5x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y0[];
Class_Descriptor cd_G5x5y0 = {  "G5x5y0", // class name
  bases_G5x5y0, 6,
  &(vtc_G5x5y0[0]), // expected_vtbl_contents
  &(vtt_G5x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G5x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y0),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y1  : virtual E5x5 , F1 {
  int ff;
  ~G5x5y1(); // tgen
  G5x5y1(); // tgen
};
//SIG(1 G5x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x5y1 ::~G5x5y1(){ note_dtor("G5x5y1", this);} // tgen
G5x5y1 ::G5x5y1(){ note_ctor("G5x5y1", this);} // tgen

static void Test_G5x5y1()
{
  extern Class_Descriptor cd_G5x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G5x5y1, buf);
    G5x5y1 *dp, &lv = *(dp=new (buf) G5x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G5x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y1)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,24), "G5x5y1");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,32), "G5x5y1");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(32,24), "G5x5y1");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(24,16), "G5x5y1");
    check_base_class_offset(lv, (E5x5*), ABISELECT(16,12), "G5x5y1");
    check_base_class_offset(lv, (F1*), 0, "G5x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x5y1.ff");
    test_class_info(&lv, &cd_G5x5y1);
    dp->~G5x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y1(Test_G5x5y1, "G5x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G5x5y1C1Ev();
extern void _ZN6G5x5y1D1Ev();
Name_Map name_map_G5x5y1[] = {
  NSPAIR(_ZN6G5x5y1C1Ev),
  NSPAIR(_ZN6G5x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G5x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G5x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y1[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y1[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y1[] = {
  {&(_ZTV6G5x5y1[4]),  4,15},
  {&(_ZTV6G5x5y1[8]),  8,15},
  {&(_ZTV6G5x5y1[11]),  11,15},
  {&(_ZTV6G5x5y1[14]),  14,15},
  {&(_tg__ZTV4E5x5__6G5x5y1[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y1[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x5y1[];
extern  VTBL_ENTRY _ZTV6G5x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y1[];
Class_Descriptor cd_G5x5y1 = {  "G5x5y1", // class name
  bases_G5x5y1, 6,
  &(vtc_G5x5y1[0]), // expected_vtbl_contents
  &(vtt_G5x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G5x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y1),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y2  : E5x5 , virtual F1 {
  int ff;
  ~G5x5y2(); // tgen
  G5x5y2(); // tgen
};
//SIG(1 G5x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x5y2 ::~G5x5y2(){ note_dtor("G5x5y2", this);} // tgen
G5x5y2 ::G5x5y2(){ note_ctor("G5x5y2", this);} // tgen

static void Test_G5x5y2()
{
  extern Class_Descriptor cd_G5x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x5y2, buf);
    G5x5y2 *dp, &lv = *(dp=new (buf) G5x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y2)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,16), "G5x5y2");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,24), "G5x5y2");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(24,16), "G5x5y2");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(8,4), "G5x5y2");
    check_base_class_offset(lv, (E5x5*), 0, "G5x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G5x5y2.ff");
    test_class_info(&lv, &cd_G5x5y2);
    dp->~G5x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y2(Test_G5x5y2, "G5x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x5y2C1Ev();
extern void _ZN6G5x5y2D1Ev();
Name_Map name_map_G5x5y2[] = {
  NSPAIR(_ZN6G5x5y2C1Ev),
  NSPAIR(_ZN6G5x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G5x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G5x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G5x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y2[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y2[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y2[] = {
  {&(_ZTV6G5x5y2[4]),  4,15},
  {&(_tg__ZTV4E5x5__6G5x5y2[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y2[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y2[2]),  2,3},
  {&(_ZTV6G5x5y2[7]),  7,15},
  {&(_ZTV6G5x5y2[10]),  10,15},
  {&(_ZTV6G5x5y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI6G5x5y2[];
extern  VTBL_ENTRY _ZTV6G5x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y2[];
Class_Descriptor cd_G5x5y2 = {  "G5x5y2", // class name
  bases_G5x5y2, 6,
  &(vtc_G5x5y2[0]), // expected_vtbl_contents
  &(vtt_G5x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y2),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y3  : virtual E5x5 , virtual F1 {
  int ff;
  ~G5x5y3(); // tgen
  G5x5y3(); // tgen
};
//SIG(1 G5x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x5y3 ::~G5x5y3(){ note_dtor("G5x5y3", this);} // tgen
G5x5y3 ::G5x5y3(){ note_ctor("G5x5y3", this);} // tgen

static void Test_G5x5y3()
{
  extern Class_Descriptor cd_G5x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G5x5y3, buf);
    G5x5y3 *dp, &lv = *(dp=new (buf) G5x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G5x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y3)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x5y3");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x5y3");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(32,20), "G5x5y3");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(24,12), "G5x5y3");
    check_base_class_offset(lv, (E5x5*), ABISELECT(16,8), "G5x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G5x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x5y3.ff");
    test_class_info(&lv, &cd_G5x5y3);
    dp->~G5x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y3(Test_G5x5y3, "G5x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN6G5x5y3C1Ev();
extern void _ZN6G5x5y3D1Ev();
Name_Map name_map_G5x5y3[] = {
  NSPAIR(_ZN6G5x5y3C1Ev),
  NSPAIR(_ZN6G5x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G5x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6G5x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y3[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y3[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y3[] = {
  {&(_ZTV6G5x5y3[5]),  5,19},
  {&(_ZTV6G5x5y3[8]),  8,19},
  {&(_ZTV6G5x5y3[11]),  11,19},
  {&(_ZTV6G5x5y3[14]),  14,19},
  {&(_ZTV6G5x5y3[18]),  18,19},
  {&(_tg__ZTV4E5x5__6G5x5y3[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y3[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x5y3[];
extern  VTBL_ENTRY _ZTV6G5x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y3[];
Class_Descriptor cd_G5x5y3 = {  "G5x5y3", // class name
  bases_G5x5y3, 6,
  &(vtc_G5x5y3[0]), // expected_vtbl_contents
  &(vtt_G5x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI6G5x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y3),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y4  : E5x5 , F0 {
  int ff;
  ~G5x5y4(); // tgen
  G5x5y4(); // tgen
};
//SIG(1 G5x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G5x5y4 ::~G5x5y4(){ note_dtor("G5x5y4", this);} // tgen
G5x5y4 ::G5x5y4(){ note_ctor("G5x5y4", this);} // tgen

static void Test_G5x5y4()
{
  extern Class_Descriptor cd_G5x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x5y4, buf);
    G5x5y4 *dp, &lv = *(dp=new (buf) G5x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y4)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,20), "G5x5y4");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,28), "G5x5y4");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(24,20), "G5x5y4");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(8,4), "G5x5y4");
    check_base_class_offset(lv, (E5x5*), 0, "G5x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G5x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G5x5y4.ff");
    test_class_info(&lv, &cd_G5x5y4);
    dp->~G5x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y4(Test_G5x5y4, "G5x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x5y4C1Ev();
extern void _ZN6G5x5y4D1Ev();
Name_Map name_map_G5x5y4[] = {
  NSPAIR(_ZN6G5x5y4C1Ev),
  NSPAIR(_ZN6G5x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G5x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G5x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y4[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y4[] = {
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y4[] = {
  {&(_ZTV6G5x5y4[3]),  3,10},
  {&(_tg__ZTV4E5x5__6G5x5y4[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y4[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y4[2]),  2,3},
  {&(_ZTV6G5x5y4[6]),  6,10},
  {&(_ZTV6G5x5y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G5x5y4[];
extern  VTBL_ENTRY _ZTV6G5x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y4[];
Class_Descriptor cd_G5x5y4 = {  "G5x5y4", // class name
  bases_G5x5y4, 6,
  &(vtc_G5x5y4[0]), // expected_vtbl_contents
  &(vtt_G5x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y4),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y5  : virtual E5x5 , F0 {
  int ff;
  ~G5x5y5(); // tgen
  G5x5y5(); // tgen
};
//SIG(1 G5x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G5x5y5 ::~G5x5y5(){ note_dtor("G5x5y5", this);} // tgen
G5x5y5 ::G5x5y5(){ note_ctor("G5x5y5", this);} // tgen

static void Test_G5x5y5()
{
  extern Class_Descriptor cd_G5x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G5x5y5, buf);
    G5x5y5 *dp, &lv = *(dp=new (buf) G5x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G5x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y5)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,24), "G5x5y5");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,32), "G5x5y5");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(32,24), "G5x5y5");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(24,16), "G5x5y5");
    check_base_class_offset(lv, (E5x5*), ABISELECT(16,12), "G5x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x5y5.ff");
    test_class_info(&lv, &cd_G5x5y5);
    dp->~G5x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y5(Test_G5x5y5, "G5x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G5x5y5C1Ev();
extern void _ZN6G5x5y5D1Ev();
Name_Map name_map_G5x5y5[] = {
  NSPAIR(_ZN6G5x5y5C1Ev),
  NSPAIR(_ZN6G5x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G5x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G5x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y5[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y5[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y5[] = {
  {&(_ZTV6G5x5y5[4]),  4,14},
  {&(_ZTV6G5x5y5[7]),  7,14},
  {&(_ZTV6G5x5y5[10]),  10,14},
  {&(_ZTV6G5x5y5[13]),  13,14},
  {&(_tg__ZTV4E5x5__6G5x5y5[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y5[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x5y5[];
extern  VTBL_ENTRY _ZTV6G5x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y5[];
Class_Descriptor cd_G5x5y5 = {  "G5x5y5", // class name
  bases_G5x5y5, 6,
  &(vtc_G5x5y5[0]), // expected_vtbl_contents
  &(vtt_G5x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G5x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y5),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y6  : E5x5 , virtual F0 {
  int ff;
  ~G5x5y6(); // tgen
  G5x5y6(); // tgen
};
//SIG(1 G5x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x5y6 ::~G5x5y6(){ note_dtor("G5x5y6", this);} // tgen
G5x5y6 ::G5x5y6(){ note_ctor("G5x5y6", this);} // tgen

static void Test_G5x5y6()
{
  extern Class_Descriptor cd_G5x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x5y6, buf);
    G5x5y6 *dp, &lv = *(dp=new (buf) G5x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y6)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,16), "G5x5y6");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,24), "G5x5y6");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(24,16), "G5x5y6");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(8,4), "G5x5y6");
    check_base_class_offset(lv, (E5x5*), 0, "G5x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G5x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G5x5y6.ff");
    test_class_info(&lv, &cd_G5x5y6);
    dp->~G5x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y6(Test_G5x5y6, "G5x5y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x5y6C1Ev();
extern void _ZN6G5x5y6D1Ev();
Name_Map name_map_G5x5y6[] = {
  NSPAIR(_ZN6G5x5y6C1Ev),
  NSPAIR(_ZN6G5x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x5y6[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G5x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G5x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y6[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y6[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y6[] = {
  {&(_ZTV6G5x5y6[4]),  4,11},
  {&(_tg__ZTV4E5x5__6G5x5y6[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y6[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y6[2]),  2,3},
  {&(_ZTV6G5x5y6[7]),  7,11},
  {&(_ZTV6G5x5y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G5x5y6[];
extern  VTBL_ENTRY _ZTV6G5x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y6[];
Class_Descriptor cd_G5x5y6 = {  "G5x5y6", // class name
  bases_G5x5y6, 6,
  &(vtc_G5x5y6[0]), // expected_vtbl_contents
  &(vtt_G5x5y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y6),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x5y7  : virtual E5x5 , virtual F0 {
  int ff;
  ~G5x5y7(); // tgen
  G5x5y7(); // tgen
};
//SIG(1 G5x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x5y7 ::~G5x5y7(){ note_dtor("G5x5y7", this);} // tgen
G5x5y7 ::G5x5y7(){ note_ctor("G5x5y7", this);} // tgen

static void Test_G5x5y7()
{
  extern Class_Descriptor cd_G5x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x5y7, buf);
    G5x5y7 *dp, &lv = *(dp=new (buf) G5x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x5y7)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x5y7");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x5y7");
    check_base_class_offset(lv, (C5*)(E5x5*), ABISELECT(32,20), "G5x5y7");
    check_base_class_offset(lv, (D0*)(E5x5*), ABISELECT(24,12), "G5x5y7");
    check_base_class_offset(lv, (E5x5*), ABISELECT(16,8), "G5x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G5x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x5y7.ff");
    test_class_info(&lv, &cd_G5x5y7);
    dp->~G5x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x5y7(Test_G5x5y7, "G5x5y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x5y7C1Ev();
extern void _ZN6G5x5y7D1Ev();
Name_Map name_map_G5x5y7[] = {
  NSPAIR(_ZN6G5x5y7C1Ev),
  NSPAIR(_ZN6G5x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x5;
extern VTBL_ENTRY _ZTI4E5x5[];
extern  VTBL_ENTRY _ZTV4E5x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E5x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x5y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x5y7[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G5x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x5y7[];
static  VTBL_ENTRY _tg__ZTV4E5x5__6G5x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x5__6G5x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x5__6G5x5y7[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x5y7[] = {
  {&(_ZTV6G5x5y7[5]),  5,15},
  {&(_ZTV6G5x5y7[8]),  8,15},
  {&(_ZTV6G5x5y7[11]),  11,15},
  {&(_ZTV6G5x5y7[14]),  14,15},
  {&(_tg__ZTV4E5x5__6G5x5y7[3]),  3,3},
  {&(_tg__ZTV2A12C5__4E5x5__6G5x5y7[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x5__6G5x5y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x5y7[];
extern  VTBL_ENTRY _ZTV6G5x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x5y7[];
Class_Descriptor cd_G5x5y7 = {  "G5x5y7", // class name
  bases_G5x5y7, 6,
  &(vtc_G5x5y7[0]), // expected_vtbl_contents
  &(vtt_G5x5y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x5y7),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x5y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E6x5  : virtual C6 , D0 {
  int fd;
  ~E6x5(); // tgen
  E6x5(); // tgen
};
//SIG(-1 E6x5) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E6x5 ::~E6x5(){ note_dtor("E6x5", this);} // tgen
E6x5 ::E6x5(){ note_ctor("E6x5", this);} // tgen

static void Test_E6x5()
{
  extern Class_Descriptor cd_E6x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E6x5, buf);
    E6x5 *dp, &lv = *(dp=new (buf) E6x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E6x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x5)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,24), "E6x5");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,12), "E6x5");
    check_base_class_offset(lv, (C6*), ABISELECT(16,12), "E6x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E6x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E6x5.fd");
    test_class_info(&lv, &cd_E6x5);
    dp->~E6x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x5(Test_E6x5, "E6x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E6x5C1Ev();
extern void _ZN4E6x5D1Ev();
Name_Map name_map_E6x5[] = {
  NSPAIR(_ZN4E6x5C1Ev),
  NSPAIR(_ZN4E6x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E6x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E6x5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E6x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E6x5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x5[] = {
  {&(_ZTV4E6x5[4]),  4,9},
  {&(_ZTV4E6x5[8]),  8,9},
  {&(_tg__ZTV2C6__4E6x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
Class_Descriptor cd_E6x5 = {  "E6x5", // class name
  bases_E6x5, 4,
  &(vtc_E6x5[0]), // expected_vtbl_contents
  &(vtt_E6x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E6x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E6x5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E6x5),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y0  : E6x5 , F1 {
  int ff;
  ~G6x5y0(); // tgen
  G6x5y0(); // tgen
};
//SIG(1 G6x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x5y0 ::~G6x5y0(){ note_dtor("G6x5y0", this);} // tgen
G6x5y0 ::G6x5y0(){ note_ctor("G6x5y0", this);} // tgen

static void Test_G6x5y0()
{
  extern Class_Descriptor cd_G6x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x5y0, buf);
    G6x5y0 *dp, &lv = *(dp=new (buf) G6x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y0)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,36), "G6x5y0");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,24), "G6x5y0");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(32,24), "G6x5y0");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(8,4), "G6x5y0");
    check_base_class_offset(lv, (E6x5*), 0, "G6x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G6x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G6x5y0.ff");
    test_class_info(&lv, &cd_G6x5y0);
    dp->~G6x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y0(Test_G6x5y0, "G6x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x5y0C1Ev();
extern void _ZN6G6x5y0D1Ev();
Name_Map name_map_G6x5y0[] = {
  NSPAIR(_ZN6G6x5y0C1Ev),
  NSPAIR(_ZN6G6x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G6x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y0[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y0[] = {
  {&(_ZTV6G6x5y0[4]),  4,12},
  {&(_tg__ZTV4E6x5__6G6x5y0[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y0[4]),  4,5},
  {&(_ZTV6G6x5y0[11]),  11,12},
  {&(_tg__ZTV2C6__6G6x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y0[];
extern  VTBL_ENTRY _ZTV6G6x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y0[];
Class_Descriptor cd_G6x5y0 = {  "G6x5y0", // class name
  bases_G6x5y0, 6,
  &(vtc_G6x5y0[0]), // expected_vtbl_contents
  &(vtt_G6x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y1  : virtual E6x5 , F1 {
  int ff;
  ~G6x5y1(); // tgen
  G6x5y1(); // tgen
};
//SIG(1 G6x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x5y1 ::~G6x5y1(){ note_dtor("G6x5y1", this);} // tgen
G6x5y1 ::G6x5y1(){ note_ctor("G6x5y1", this);} // tgen

static void Test_G6x5y1()
{
  extern Class_Descriptor cd_G6x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x5y1, buf);
    G6x5y1 *dp, &lv = *(dp=new (buf) G6x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y1)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,36), "G6x5y1");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,24), "G6x5y1");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(32,24), "G6x5y1");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(24,16), "G6x5y1");
    check_base_class_offset(lv, (E6x5*), ABISELECT(16,12), "G6x5y1");
    check_base_class_offset(lv, (F1*), 0, "G6x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x5y1.ff");
    test_class_info(&lv, &cd_G6x5y1);
    dp->~G6x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y1(Test_G6x5y1, "G6x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x5y1C1Ev();
extern void _ZN6G6x5y1D1Ev();
Name_Map name_map_G6x5y1[] = {
  NSPAIR(_ZN6G6x5y1C1Ev),
  NSPAIR(_ZN6G6x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G6x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y1[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y1[] = {
  {&(_ZTV6G6x5y1[5]),  5,15},
  {&(_ZTV6G6x5y1[10]),  10,15},
  {&(_ZTV6G6x5y1[14]),  14,15},
  {&(_tg__ZTV4E6x5__6G6x5y1[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y1[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y1[];
extern  VTBL_ENTRY _ZTV6G6x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y1[];
Class_Descriptor cd_G6x5y1 = {  "G6x5y1", // class name
  bases_G6x5y1, 6,
  &(vtc_G6x5y1[0]), // expected_vtbl_contents
  &(vtt_G6x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y2  : E6x5 , virtual F1 {
  int ff;
  ~G6x5y2(); // tgen
  G6x5y2(); // tgen
};
//SIG(1 G6x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x5y2 ::~G6x5y2(){ note_dtor("G6x5y2", this);} // tgen
G6x5y2 ::G6x5y2(){ note_ctor("G6x5y2", this);} // tgen

static void Test_G6x5y2()
{
  extern Class_Descriptor cd_G6x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x5y2, buf);
    G6x5y2 *dp, &lv = *(dp=new (buf) G6x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y2)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,28), "G6x5y2");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,16), "G6x5y2");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(24,16), "G6x5y2");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(8,4), "G6x5y2");
    check_base_class_offset(lv, (E6x5*), 0, "G6x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G6x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G6x5y2.ff");
    test_class_info(&lv, &cd_G6x5y2);
    dp->~G6x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y2(Test_G6x5y2, "G6x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G6x5y2C1Ev();
extern void _ZN6G6x5y2D1Ev();
Name_Map name_map_G6x5y2[] = {
  NSPAIR(_ZN6G6x5y2C1Ev),
  NSPAIR(_ZN6G6x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G6x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G6x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y2[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y2[] = {
  {&(_ZTV6G6x5y2[5]),  5,14},
  {&(_tg__ZTV4E6x5__6G6x5y2[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y2[4]),  4,5},
  {&(_ZTV6G6x5y2[9]),  9,14},
  {&(_ZTV6G6x5y2[13]),  13,14},
  {&(_tg__ZTV2C6__6G6x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y2[];
extern  VTBL_ENTRY _ZTV6G6x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y2[];
Class_Descriptor cd_G6x5y2 = {  "G6x5y2", // class name
  bases_G6x5y2, 6,
  &(vtc_G6x5y2[0]), // expected_vtbl_contents
  &(vtt_G6x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G6x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y3  : virtual E6x5 , virtual F1 {
  int ff;
  ~G6x5y3(); // tgen
  G6x5y3(); // tgen
};
//SIG(1 G6x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x5y3 ::~G6x5y3(){ note_dtor("G6x5y3", this);} // tgen
G6x5y3 ::G6x5y3(){ note_ctor("G6x5y3", this);} // tgen

static void Test_G6x5y3()
{
  extern Class_Descriptor cd_G6x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G6x5y3, buf);
    G6x5y3 *dp, &lv = *(dp=new (buf) G6x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G6x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y3)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x5y3");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x5y3");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(32,20), "G6x5y3");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(24,12), "G6x5y3");
    check_base_class_offset(lv, (E6x5*), ABISELECT(16,8), "G6x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G6x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x5y3.ff");
    test_class_info(&lv, &cd_G6x5y3);
    dp->~G6x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y3(Test_G6x5y3, "G6x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G6x5y3C1Ev();
extern void _ZN6G6x5y3D1Ev();
Name_Map name_map_G6x5y3[] = {
  NSPAIR(_ZN6G6x5y3C1Ev),
  NSPAIR(_ZN6G6x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G6x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G6x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y3[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y3[] = {
  {&(_ZTV6G6x5y3[6]),  6,19},
  {&(_ZTV6G6x5y3[10]),  10,19},
  {&(_ZTV6G6x5y3[14]),  14,19},
  {&(_ZTV6G6x5y3[18]),  18,19},
  {&(_tg__ZTV4E6x5__6G6x5y3[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y3[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y3[];
extern  VTBL_ENTRY _ZTV6G6x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y3[];
Class_Descriptor cd_G6x5y3 = {  "G6x5y3", // class name
  bases_G6x5y3, 6,
  &(vtc_G6x5y3[0]), // expected_vtbl_contents
  &(vtt_G6x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G6x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y4  : E6x5 , F0 {
  int ff;
  ~G6x5y4(); // tgen
  G6x5y4(); // tgen
};
//SIG(1 G6x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G6x5y4 ::~G6x5y4(){ note_dtor("G6x5y4", this);} // tgen
G6x5y4 ::G6x5y4(){ note_ctor("G6x5y4", this);} // tgen

static void Test_G6x5y4()
{
  extern Class_Descriptor cd_G6x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x5y4, buf);
    G6x5y4 *dp, &lv = *(dp=new (buf) G6x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y4)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,32), "G6x5y4");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,20), "G6x5y4");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(24,20), "G6x5y4");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(8,4), "G6x5y4");
    check_base_class_offset(lv, (E6x5*), 0, "G6x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G6x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G6x5y4.ff");
    test_class_info(&lv, &cd_G6x5y4);
    dp->~G6x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y4(Test_G6x5y4, "G6x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x5y4C1Ev();
extern void _ZN6G6x5y4D1Ev();
Name_Map name_map_G6x5y4[] = {
  NSPAIR(_ZN6G6x5y4C1Ev),
  NSPAIR(_ZN6G6x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G6x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y4[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y4[] = {
  {&(_ZTV6G6x5y4[4]),  4,9},
  {&(_tg__ZTV4E6x5__6G6x5y4[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y4[4]),  4,5},
  {&(_ZTV6G6x5y4[8]),  8,9},
  {&(_tg__ZTV2C6__6G6x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y4[];
extern  VTBL_ENTRY _ZTV6G6x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y4[];
Class_Descriptor cd_G6x5y4 = {  "G6x5y4", // class name
  bases_G6x5y4, 6,
  &(vtc_G6x5y4[0]), // expected_vtbl_contents
  &(vtt_G6x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y5  : virtual E6x5 , F0 {
  int ff;
  ~G6x5y5(); // tgen
  G6x5y5(); // tgen
};
//SIG(1 G6x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G6x5y5 ::~G6x5y5(){ note_dtor("G6x5y5", this);} // tgen
G6x5y5 ::G6x5y5(){ note_ctor("G6x5y5", this);} // tgen

static void Test_G6x5y5()
{
  extern Class_Descriptor cd_G6x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x5y5, buf);
    G6x5y5 *dp, &lv = *(dp=new (buf) G6x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y5)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,36), "G6x5y5");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,24), "G6x5y5");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(32,24), "G6x5y5");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(24,16), "G6x5y5");
    check_base_class_offset(lv, (E6x5*), ABISELECT(16,12), "G6x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x5y5.ff");
    test_class_info(&lv, &cd_G6x5y5);
    dp->~G6x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y5(Test_G6x5y5, "G6x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x5y5C1Ev();
extern void _ZN6G6x5y5D1Ev();
Name_Map name_map_G6x5y5[] = {
  NSPAIR(_ZN6G6x5y5C1Ev),
  NSPAIR(_ZN6G6x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G6x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y5[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y5[] = {
  {&(_ZTV6G6x5y5[5]),  5,14},
  {&(_ZTV6G6x5y5[9]),  9,14},
  {&(_ZTV6G6x5y5[13]),  13,14},
  {&(_tg__ZTV4E6x5__6G6x5y5[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y5[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y5[];
extern  VTBL_ENTRY _ZTV6G6x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y5[];
Class_Descriptor cd_G6x5y5 = {  "G6x5y5", // class name
  bases_G6x5y5, 6,
  &(vtc_G6x5y5[0]), // expected_vtbl_contents
  &(vtt_G6x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y6  : E6x5 , virtual F0 {
  int ff;
  ~G6x5y6(); // tgen
  G6x5y6(); // tgen
};
//SIG(1 G6x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x5y6 ::~G6x5y6(){ note_dtor("G6x5y6", this);} // tgen
G6x5y6 ::G6x5y6(){ note_ctor("G6x5y6", this);} // tgen

static void Test_G6x5y6()
{
  extern Class_Descriptor cd_G6x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x5y6, buf);
    G6x5y6 *dp, &lv = *(dp=new (buf) G6x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y6)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,28), "G6x5y6");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,16), "G6x5y6");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(24,16), "G6x5y6");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(8,4), "G6x5y6");
    check_base_class_offset(lv, (E6x5*), 0, "G6x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G6x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G6x5y6.ff");
    test_class_info(&lv, &cd_G6x5y6);
    dp->~G6x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y6(Test_G6x5y6, "G6x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x5y6C1Ev();
extern void _ZN6G6x5y6D1Ev();
Name_Map name_map_G6x5y6[] = {
  NSPAIR(_ZN6G6x5y6C1Ev),
  NSPAIR(_ZN6G6x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G6x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y6[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y6[] = {
  {&(_ZTV6G6x5y6[5]),  5,10},
  {&(_tg__ZTV4E6x5__6G6x5y6[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y6[4]),  4,5},
  {&(_ZTV6G6x5y6[9]),  9,10},
  {&(_tg__ZTV2C6__6G6x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y6[];
extern  VTBL_ENTRY _ZTV6G6x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y6[];
Class_Descriptor cd_G6x5y6 = {  "G6x5y6", // class name
  bases_G6x5y6, 6,
  &(vtc_G6x5y6[0]), // expected_vtbl_contents
  &(vtt_G6x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x5y7  : virtual E6x5 , virtual F0 {
  int ff;
  ~G6x5y7(); // tgen
  G6x5y7(); // tgen
};
//SIG(1 G6x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x5y7 ::~G6x5y7(){ note_dtor("G6x5y7", this);} // tgen
G6x5y7 ::G6x5y7(){ note_ctor("G6x5y7", this);} // tgen

static void Test_G6x5y7()
{
  extern Class_Descriptor cd_G6x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x5y7, buf);
    G6x5y7 *dp, &lv = *(dp=new (buf) G6x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x5y7)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x5y7");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x5y7");
    check_base_class_offset(lv, (C6*)(E6x5*), ABISELECT(32,20), "G6x5y7");
    check_base_class_offset(lv, (D0*)(E6x5*), ABISELECT(24,12), "G6x5y7");
    check_base_class_offset(lv, (E6x5*), ABISELECT(16,8), "G6x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G6x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x5y7.ff");
    test_class_info(&lv, &cd_G6x5y7);
    dp->~G6x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x5y7(Test_G6x5y7, "G6x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x5y7C1Ev();
extern void _ZN6G6x5y7D1Ev();
Name_Map name_map_G6x5y7[] = {
  NSPAIR(_ZN6G6x5y7C1Ev),
  NSPAIR(_ZN6G6x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x5;
extern VTBL_ENTRY _ZTI4E6x5[];
extern  VTBL_ENTRY _ZTV4E6x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E6x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x5y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G6x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x5y7[];
static  VTBL_ENTRY _tg__ZTV4E6x5__6G6x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x5__6G6x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x5y7[] = {
  {&(_ZTV6G6x5y7[6]),  6,15},
  {&(_ZTV6G6x5y7[10]),  10,15},
  {&(_ZTV6G6x5y7[14]),  14,15},
  {&(_tg__ZTV4E6x5__6G6x5y7[4]),  4,4},
  {&(_tg__ZTV2C6__4E6x5__6G6x5y7[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x5y7[];
extern  VTBL_ENTRY _ZTV6G6x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x5y7[];
Class_Descriptor cd_G6x5y7 = {  "G6x5y7", // class name
  bases_G6x5y7, 6,
  &(vtc_G6x5y7[0]), // expected_vtbl_contents
  &(vtt_G6x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x5y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x5y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E7x5  : virtual C7 , D0 {
  int fd;
  ~E7x5(); // tgen
  E7x5(); // tgen
};
//SIG(-1 E7x5) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E7x5 ::~E7x5(){ note_dtor("E7x5", this);} // tgen
E7x5 ::E7x5(){ note_ctor("E7x5", this);} // tgen

static void Test_E7x5()
{
  extern Class_Descriptor cd_E7x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E7x5, buf);
    E7x5 *dp, &lv = *(dp=new (buf) E7x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E7x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x5)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,24), "E7x5");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,12), "E7x5");
    check_base_class_offset(lv, (C7*), ABISELECT(16,12), "E7x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E7x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E7x5.fd");
    test_class_info(&lv, &cd_E7x5);
    dp->~E7x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x5(Test_E7x5, "E7x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN4E7x5C1Ev();
extern void _ZN4E7x5D1Ev();
Name_Map name_map_E7x5[] = {
  NSPAIR(_ZN4E7x5C1Ev),
  NSPAIR(_ZN4E7x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E7x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E7x5[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E7x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E7x5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__4E7x5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x5[] = {
  {&(_ZTV4E7x5[4]),  4,13},
  {&(_ZTV4E7x5[8]),  8,13},
  {&(_ZTV4E7x5[12]),  12,13},
  {&(_tg__ZTV2C7__4E7x5[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__4E7x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
Class_Descriptor cd_E7x5 = {  "E7x5", // class name
  bases_E7x5, 4,
  &(vtc_E7x5[0]), // expected_vtbl_contents
  &(vtt_E7x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI4E7x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E7x5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E7x5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y0  : E7x5 , F1 {
  int ff;
  ~G7x5y0(); // tgen
  G7x5y0(); // tgen
};
//SIG(1 G7x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x5y0 ::~G7x5y0(){ note_dtor("G7x5y0", this);} // tgen
G7x5y0 ::G7x5y0(){ note_ctor("G7x5y0", this);} // tgen

static void Test_G7x5y0()
{
  extern Class_Descriptor cd_G7x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x5y0, buf);
    G7x5y0 *dp, &lv = *(dp=new (buf) G7x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y0)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,36), "G7x5y0");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,24), "G7x5y0");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(32,24), "G7x5y0");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(8,4), "G7x5y0");
    check_base_class_offset(lv, (E7x5*), 0, "G7x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G7x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G7x5y0.ff");
    test_class_info(&lv, &cd_G7x5y0);
    dp->~G7x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y0(Test_G7x5y0, "G7x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x5y0C1Ev();
extern void _ZN6G7x5y0D1Ev();
Name_Map name_map_G7x5y0[] = {
  NSPAIR(_ZN6G7x5y0C1Ev),
  NSPAIR(_ZN6G7x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G7x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y0[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y0[] = {
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y0[] = {
  {&(_ZTV6G7x5y0[4]),  4,16},
  {&(_tg__ZTV4E7x5__6G7x5y0[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y0[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y0[3]),  3,4},
  {&(_ZTV6G7x5y0[11]),  11,16},
  {&(_ZTV6G7x5y0[15]),  15,16},
  {&(_tg__ZTV2C7__6G7x5y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y0[];
extern  VTBL_ENTRY _ZTV6G7x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y0[];
Class_Descriptor cd_G7x5y0 = {  "G7x5y0", // class name
  bases_G7x5y0, 6,
  &(vtc_G7x5y0[0]), // expected_vtbl_contents
  &(vtt_G7x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y1  : virtual E7x5 , F1 {
  int ff;
  ~G7x5y1(); // tgen
  G7x5y1(); // tgen
};
//SIG(1 G7x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x5y1 ::~G7x5y1(){ note_dtor("G7x5y1", this);} // tgen
G7x5y1 ::G7x5y1(){ note_ctor("G7x5y1", this);} // tgen

static void Test_G7x5y1()
{
  extern Class_Descriptor cd_G7x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x5y1, buf);
    G7x5y1 *dp, &lv = *(dp=new (buf) G7x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y1)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,36), "G7x5y1");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,24), "G7x5y1");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(32,24), "G7x5y1");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(24,16), "G7x5y1");
    check_base_class_offset(lv, (E7x5*), ABISELECT(16,12), "G7x5y1");
    check_base_class_offset(lv, (F1*), 0, "G7x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x5y1.ff");
    test_class_info(&lv, &cd_G7x5y1);
    dp->~G7x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y1(Test_G7x5y1, "G7x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x5y1C1Ev();
extern void _ZN6G7x5y1D1Ev();
Name_Map name_map_G7x5y1[] = {
  NSPAIR(_ZN6G7x5y1C1Ev),
  NSPAIR(_ZN6G7x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G7x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y1[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y1[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y1[] = {
  {&(_ZTV6G7x5y1[5]),  5,19},
  {&(_ZTV6G7x5y1[10]),  10,19},
  {&(_ZTV6G7x5y1[14]),  14,19},
  {&(_ZTV6G7x5y1[18]),  18,19},
  {&(_tg__ZTV4E7x5__6G7x5y1[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y1[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y1[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x5y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y1[];
extern  VTBL_ENTRY _ZTV6G7x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y1[];
Class_Descriptor cd_G7x5y1 = {  "G7x5y1", // class name
  bases_G7x5y1, 6,
  &(vtc_G7x5y1[0]), // expected_vtbl_contents
  &(vtt_G7x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y2  : E7x5 , virtual F1 {
  int ff;
  ~G7x5y2(); // tgen
  G7x5y2(); // tgen
};
//SIG(1 G7x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x5y2 ::~G7x5y2(){ note_dtor("G7x5y2", this);} // tgen
G7x5y2 ::G7x5y2(){ note_ctor("G7x5y2", this);} // tgen

static void Test_G7x5y2()
{
  extern Class_Descriptor cd_G7x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x5y2, buf);
    G7x5y2 *dp, &lv = *(dp=new (buf) G7x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y2)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,28), "G7x5y2");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,16), "G7x5y2");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(24,16), "G7x5y2");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(8,4), "G7x5y2");
    check_base_class_offset(lv, (E7x5*), 0, "G7x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G7x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G7x5y2.ff");
    test_class_info(&lv, &cd_G7x5y2);
    dp->~G7x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y2(Test_G7x5y2, "G7x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G7x5y2C1Ev();
extern void _ZN6G7x5y2D1Ev();
Name_Map name_map_G7x5y2[] = {
  NSPAIR(_ZN6G7x5y2C1Ev),
  NSPAIR(_ZN6G7x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y2[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G7x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G7x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y2[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y2[] = {
  {&(_ZTV6G7x5y2[5]),  5,18},
  {&(_tg__ZTV4E7x5__6G7x5y2[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y2[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y2[3]),  3,4},
  {&(_ZTV6G7x5y2[9]),  9,18},
  {&(_ZTV6G7x5y2[13]),  13,18},
  {&(_ZTV6G7x5y2[17]),  17,18},
  {&(_tg__ZTV2C7__6G7x5y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y2[];
extern  VTBL_ENTRY _ZTV6G7x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y2[];
Class_Descriptor cd_G7x5y2 = {  "G7x5y2", // class name
  bases_G7x5y2, 6,
  &(vtc_G7x5y2[0]), // expected_vtbl_contents
  &(vtt_G7x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G7x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y3  : virtual E7x5 , virtual F1 {
  int ff;
  ~G7x5y3(); // tgen
  G7x5y3(); // tgen
};
//SIG(1 G7x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x5y3 ::~G7x5y3(){ note_dtor("G7x5y3", this);} // tgen
G7x5y3 ::G7x5y3(){ note_ctor("G7x5y3", this);} // tgen

static void Test_G7x5y3()
{
  extern Class_Descriptor cd_G7x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G7x5y3, buf);
    G7x5y3 *dp, &lv = *(dp=new (buf) G7x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G7x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y3)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x5y3");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x5y3");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(32,20), "G7x5y3");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(24,12), "G7x5y3");
    check_base_class_offset(lv, (E7x5*), ABISELECT(16,8), "G7x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G7x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x5y3.ff");
    test_class_info(&lv, &cd_G7x5y3);
    dp->~G7x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y3(Test_G7x5y3, "G7x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN6G7x5y3C1Ev();
extern void _ZN6G7x5y3D1Ev();
Name_Map name_map_G7x5y3[] = {
  NSPAIR(_ZN6G7x5y3C1Ev),
  NSPAIR(_ZN6G7x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y3[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G7x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G7x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6G7x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y3[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y3[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y3[] = {
  {&(_ZTV6G7x5y3[6]),  6,23},
  {&(_ZTV6G7x5y3[10]),  10,23},
  {&(_ZTV6G7x5y3[14]),  14,23},
  {&(_ZTV6G7x5y3[18]),  18,23},
  {&(_ZTV6G7x5y3[22]),  22,23},
  {&(_tg__ZTV4E7x5__6G7x5y3[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y3[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y3[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x5y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y3[];
extern  VTBL_ENTRY _ZTV6G7x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y3[];
Class_Descriptor cd_G7x5y3 = {  "G7x5y3", // class name
  bases_G7x5y3, 6,
  &(vtc_G7x5y3[0]), // expected_vtbl_contents
  &(vtt_G7x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI6G7x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y4  : E7x5 , F0 {
  int ff;
  ~G7x5y4(); // tgen
  G7x5y4(); // tgen
};
//SIG(1 G7x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G7x5y4 ::~G7x5y4(){ note_dtor("G7x5y4", this);} // tgen
G7x5y4 ::G7x5y4(){ note_ctor("G7x5y4", this);} // tgen

static void Test_G7x5y4()
{
  extern Class_Descriptor cd_G7x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x5y4, buf);
    G7x5y4 *dp, &lv = *(dp=new (buf) G7x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y4)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,32), "G7x5y4");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,20), "G7x5y4");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(24,20), "G7x5y4");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(8,4), "G7x5y4");
    check_base_class_offset(lv, (E7x5*), 0, "G7x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G7x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G7x5y4.ff");
    test_class_info(&lv, &cd_G7x5y4);
    dp->~G7x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y4(Test_G7x5y4, "G7x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x5y4C1Ev();
extern void _ZN6G7x5y4D1Ev();
Name_Map name_map_G7x5y4[] = {
  NSPAIR(_ZN6G7x5y4C1Ev),
  NSPAIR(_ZN6G7x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y4[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G7x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G7x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y4[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y4[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y4[] = {
  {&(_ZTV6G7x5y4[4]),  4,13},
  {&(_tg__ZTV4E7x5__6G7x5y4[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y4[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y4[3]),  3,4},
  {&(_ZTV6G7x5y4[8]),  8,13},
  {&(_ZTV6G7x5y4[12]),  12,13},
  {&(_tg__ZTV2C7__6G7x5y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y4[];
extern  VTBL_ENTRY _ZTV6G7x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y4[];
Class_Descriptor cd_G7x5y4 = {  "G7x5y4", // class name
  bases_G7x5y4, 6,
  &(vtc_G7x5y4[0]), // expected_vtbl_contents
  &(vtt_G7x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y5  : virtual E7x5 , F0 {
  int ff;
  ~G7x5y5(); // tgen
  G7x5y5(); // tgen
};
//SIG(1 G7x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G7x5y5 ::~G7x5y5(){ note_dtor("G7x5y5", this);} // tgen
G7x5y5 ::G7x5y5(){ note_ctor("G7x5y5", this);} // tgen

static void Test_G7x5y5()
{
  extern Class_Descriptor cd_G7x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x5y5, buf);
    G7x5y5 *dp, &lv = *(dp=new (buf) G7x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y5)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,36), "G7x5y5");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,24), "G7x5y5");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(32,24), "G7x5y5");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(24,16), "G7x5y5");
    check_base_class_offset(lv, (E7x5*), ABISELECT(16,12), "G7x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x5y5.ff");
    test_class_info(&lv, &cd_G7x5y5);
    dp->~G7x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y5(Test_G7x5y5, "G7x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x5y5C1Ev();
extern void _ZN6G7x5y5D1Ev();
Name_Map name_map_G7x5y5[] = {
  NSPAIR(_ZN6G7x5y5C1Ev),
  NSPAIR(_ZN6G7x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y5[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G7x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y5[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y5[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y5[] = {
  {&(_ZTV6G7x5y5[5]),  5,18},
  {&(_ZTV6G7x5y5[9]),  9,18},
  {&(_ZTV6G7x5y5[13]),  13,18},
  {&(_ZTV6G7x5y5[17]),  17,18},
  {&(_tg__ZTV4E7x5__6G7x5y5[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y5[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y5[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x5y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y5[];
extern  VTBL_ENTRY _ZTV6G7x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y5[];
Class_Descriptor cd_G7x5y5 = {  "G7x5y5", // class name
  bases_G7x5y5, 6,
  &(vtc_G7x5y5[0]), // expected_vtbl_contents
  &(vtt_G7x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y6  : E7x5 , virtual F0 {
  int ff;
  ~G7x5y6(); // tgen
  G7x5y6(); // tgen
};
//SIG(1 G7x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x5y6 ::~G7x5y6(){ note_dtor("G7x5y6", this);} // tgen
G7x5y6 ::G7x5y6(){ note_ctor("G7x5y6", this);} // tgen

static void Test_G7x5y6()
{
  extern Class_Descriptor cd_G7x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x5y6, buf);
    G7x5y6 *dp, &lv = *(dp=new (buf) G7x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y6)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,28), "G7x5y6");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,16), "G7x5y6");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(24,16), "G7x5y6");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(8,4), "G7x5y6");
    check_base_class_offset(lv, (E7x5*), 0, "G7x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G7x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G7x5y6.ff");
    test_class_info(&lv, &cd_G7x5y6);
    dp->~G7x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y6(Test_G7x5y6, "G7x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x5y6C1Ev();
extern void _ZN6G7x5y6D1Ev();
Name_Map name_map_G7x5y6[] = {
  NSPAIR(_ZN6G7x5y6C1Ev),
  NSPAIR(_ZN6G7x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y6[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G7x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y6[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y6[] = {
  {&(_ZTV6G7x5y6[5]),  5,14},
  {&(_tg__ZTV4E7x5__6G7x5y6[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y6[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y6[3]),  3,4},
  {&(_ZTV6G7x5y6[9]),  9,14},
  {&(_ZTV6G7x5y6[13]),  13,14},
  {&(_tg__ZTV2C7__6G7x5y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y6[];
extern  VTBL_ENTRY _ZTV6G7x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y6[];
Class_Descriptor cd_G7x5y6 = {  "G7x5y6", // class name
  bases_G7x5y6, 6,
  &(vtc_G7x5y6[0]), // expected_vtbl_contents
  &(vtt_G7x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x5y7  : virtual E7x5 , virtual F0 {
  int ff;
  ~G7x5y7(); // tgen
  G7x5y7(); // tgen
};
//SIG(1 G7x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x5y7 ::~G7x5y7(){ note_dtor("G7x5y7", this);} // tgen
G7x5y7 ::G7x5y7(){ note_ctor("G7x5y7", this);} // tgen

static void Test_G7x5y7()
{
  extern Class_Descriptor cd_G7x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x5y7, buf);
    G7x5y7 *dp, &lv = *(dp=new (buf) G7x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x5y7)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x5y7");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x5y7");
    check_base_class_offset(lv, (C7*)(E7x5*), ABISELECT(32,20), "G7x5y7");
    check_base_class_offset(lv, (D0*)(E7x5*), ABISELECT(24,12), "G7x5y7");
    check_base_class_offset(lv, (E7x5*), ABISELECT(16,8), "G7x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G7x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x5y7.ff");
    test_class_info(&lv, &cd_G7x5y7);
    dp->~G7x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x5y7(Test_G7x5y7, "G7x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x5y7C1Ev();
extern void _ZN6G7x5y7D1Ev();
Name_Map name_map_G7x5y7[] = {
  NSPAIR(_ZN6G7x5y7C1Ev),
  NSPAIR(_ZN6G7x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x5;
extern VTBL_ENTRY _ZTI4E7x5[];
extern  VTBL_ENTRY _ZTV4E7x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E7x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x5y7[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G7x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G7x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x5y7[];
static  VTBL_ENTRY _tg__ZTV4E7x5__6G7x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x5__6G7x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x5__6G7x5y7[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x5y7[] = {
  {&(_ZTV6G7x5y7[6]),  6,19},
  {&(_ZTV6G7x5y7[10]),  10,19},
  {&(_ZTV6G7x5y7[14]),  14,19},
  {&(_ZTV6G7x5y7[18]),  18,19},
  {&(_tg__ZTV4E7x5__6G7x5y7[4]),  4,4},
  {&(_tg__ZTV2C7__4E7x5__6G7x5y7[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x5__6G7x5y7[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x5y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x5y7[];
extern  VTBL_ENTRY _ZTV6G7x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x5y7[];
Class_Descriptor cd_G7x5y7 = {  "G7x5y7", // class name
  bases_G7x5y7, 6,
  &(vtc_G7x5y7[0]), // expected_vtbl_contents
  &(vtt_G7x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x5y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x5y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x5  : virtual C8 , D0 {
  int fd;
  ~E8x5(); // tgen
  E8x5(); // tgen
};
//SIG(-1 E8x5) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E8x5 ::~E8x5(){ note_dtor("E8x5", this);} // tgen
E8x5 ::E8x5(){ note_ctor("E8x5", this);} // tgen

static void Test_E8x5()
{
  extern Class_Descriptor cd_E8x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E8x5, buf);
    E8x5 *dp, &lv = *(dp=new (buf) E8x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E8x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x5)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,16), "E8x5");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,24), "E8x5");
    check_base_class_offset(lv, (C8*), ABISELECT(16,12), "E8x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E8x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E8x5.fd");
    test_class_info(&lv, &cd_E8x5);
    dp->~E8x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x5(Test_E8x5, "E8x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E8x5C1Ev();
extern void _ZN4E8x5D1Ev();
Name_Map name_map_E8x5[] = {
  NSPAIR(_ZN4E8x5C1Ev),
  NSPAIR(_ZN4E8x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E8x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E8x5[];
static  VTBL_ENTRY vtc_E8x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
extern VTBL_ENTRY _ZTV4E8x5[];
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x5[] = {
  {&(_ZTV4E8x5[4]),  4,7},
  {&(_ZTV4E8x5[7]),  7,7},
  {&(_tg__ZTV2C8__4E8x5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
Class_Descriptor cd_E8x5 = {  "E8x5", // class name
  bases_E8x5, 4,
  &(vtc_E8x5[0]), // expected_vtbl_contents
  &(vtt_E8x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E8x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E8x5),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E8x5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y0  : E8x5 , F1 {
  int ff;
  ~G8x5y0(); // tgen
  G8x5y0(); // tgen
};
//SIG(1 G8x5y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x5y0 ::~G8x5y0(){ note_dtor("G8x5y0", this);} // tgen
G8x5y0 ::G8x5y0(){ note_ctor("G8x5y0", this);} // tgen

static void Test_G8x5y0()
{
  extern Class_Descriptor cd_G8x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x5y0, buf);
    G8x5y0 *dp, &lv = *(dp=new (buf) G8x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y0)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,28), "G8x5y0");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,36), "G8x5y0");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(32,24), "G8x5y0");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(8,4), "G8x5y0");
    check_base_class_offset(lv, (E8x5*), 0, "G8x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G8x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G8x5y0.ff");
    test_class_info(&lv, &cd_G8x5y0);
    dp->~G8x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y0(Test_G8x5y0, "G8x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x5y0C1Ev();
extern void _ZN6G8x5y0D1Ev();
Name_Map name_map_G8x5y0[] = {
  NSPAIR(_ZN6G8x5y0C1Ev),
  NSPAIR(_ZN6G8x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G8x5y0[0]),
};
extern VTBL_ENTRY _ZTV6G8x5y0[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y0[] = {
  {&(_ZTV6G8x5y0[4]),  4,10},
  {&(_tg__ZTV4E8x5__6G8x5y0[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y0[3]),  3,3},
  {&(_ZTV6G8x5y0[10]),  10,10},
  {&(_tg__ZTV2C8__6G8x5y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y0[];
extern  VTBL_ENTRY _ZTV6G8x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y0[];
Class_Descriptor cd_G8x5y0 = {  "G8x5y0", // class name
  bases_G8x5y0, 6,
  &(vtc_G8x5y0[0]), // expected_vtbl_contents
  &(vtt_G8x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y0),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y1  : virtual E8x5 , F1 {
  int ff;
  ~G8x5y1(); // tgen
  G8x5y1(); // tgen
};
//SIG(1 G8x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x5y1 ::~G8x5y1(){ note_dtor("G8x5y1", this);} // tgen
G8x5y1 ::G8x5y1(){ note_ctor("G8x5y1", this);} // tgen

static void Test_G8x5y1()
{
  extern Class_Descriptor cd_G8x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x5y1, buf);
    G8x5y1 *dp, &lv = *(dp=new (buf) G8x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y1)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,28), "G8x5y1");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,36), "G8x5y1");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(32,24), "G8x5y1");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(24,16), "G8x5y1");
    check_base_class_offset(lv, (E8x5*), ABISELECT(16,12), "G8x5y1");
    check_base_class_offset(lv, (F1*), 0, "G8x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x5y1.ff");
    test_class_info(&lv, &cd_G8x5y1);
    dp->~G8x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y1(Test_G8x5y1, "G8x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x5y1C1Ev();
extern void _ZN6G8x5y1D1Ev();
Name_Map name_map_G8x5y1[] = {
  NSPAIR(_ZN6G8x5y1C1Ev),
  NSPAIR(_ZN6G8x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x5y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G8x5y1[0]),
};
extern VTBL_ENTRY _ZTV6G8x5y1[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y1[] = {
  {&(_ZTV6G8x5y1[5]),  5,13},
  {&(_ZTV6G8x5y1[10]),  10,13},
  {&(_ZTV6G8x5y1[13]),  13,13},
  {&(_tg__ZTV4E8x5__6G8x5y1[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y1[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x5y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y1[];
extern  VTBL_ENTRY _ZTV6G8x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y1[];
Class_Descriptor cd_G8x5y1 = {  "G8x5y1", // class name
  bases_G8x5y1, 6,
  &(vtc_G8x5y1[0]), // expected_vtbl_contents
  &(vtt_G8x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y1),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y2  : E8x5 , virtual F1 {
  int ff;
  ~G8x5y2(); // tgen
  G8x5y2(); // tgen
};
//SIG(1 G8x5y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x5y2 ::~G8x5y2(){ note_dtor("G8x5y2", this);} // tgen
G8x5y2 ::G8x5y2(){ note_ctor("G8x5y2", this);} // tgen

static void Test_G8x5y2()
{
  extern Class_Descriptor cd_G8x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x5y2, buf);
    G8x5y2 *dp, &lv = *(dp=new (buf) G8x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y2)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,20), "G8x5y2");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,28), "G8x5y2");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(24,16), "G8x5y2");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(8,4), "G8x5y2");
    check_base_class_offset(lv, (E8x5*), 0, "G8x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G8x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G8x5y2.ff");
    test_class_info(&lv, &cd_G8x5y2);
    dp->~G8x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y2(Test_G8x5y2, "G8x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G8x5y2C1Ev();
extern void _ZN6G8x5y2D1Ev();
Name_Map name_map_G8x5y2[] = {
  NSPAIR(_ZN6G8x5y2C1Ev),
  NSPAIR(_ZN6G8x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y2[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G8x5y2[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G8x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x5y2[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y2[] = {
  {&(_ZTV6G8x5y2[5]),  5,12},
  {&(_tg__ZTV4E8x5__6G8x5y2[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y2[3]),  3,3},
  {&(_ZTV6G8x5y2[8]),  8,12},
  {&(_ZTV6G8x5y2[11]),  11,12},
  {&(_tg__ZTV2C8__6G8x5y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y2[];
extern  VTBL_ENTRY _ZTV6G8x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y2[];
Class_Descriptor cd_G8x5y2 = {  "G8x5y2", // class name
  bases_G8x5y2, 6,
  &(vtc_G8x5y2[0]), // expected_vtbl_contents
  &(vtt_G8x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G8x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y2),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y3  : virtual E8x5 , virtual F1 {
  int ff;
  ~G8x5y3(); // tgen
  G8x5y3(); // tgen
};
//SIG(1 G8x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x5y3 ::~G8x5y3(){ note_dtor("G8x5y3", this);} // tgen
G8x5y3 ::G8x5y3(){ note_ctor("G8x5y3", this);} // tgen

static void Test_G8x5y3()
{
  extern Class_Descriptor cd_G8x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G8x5y3, buf);
    G8x5y3 *dp, &lv = *(dp=new (buf) G8x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G8x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y3)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x5y3");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x5y3");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(32,20), "G8x5y3");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(24,12), "G8x5y3");
    check_base_class_offset(lv, (E8x5*), ABISELECT(16,8), "G8x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G8x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x5y3.ff");
    test_class_info(&lv, &cd_G8x5y3);
    dp->~G8x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y3(Test_G8x5y3, "G8x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G8x5y3C1Ev();
extern void _ZN6G8x5y3D1Ev();
Name_Map name_map_G8x5y3[] = {
  NSPAIR(_ZN6G8x5y3C1Ev),
  NSPAIR(_ZN6G8x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G8x5y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G8x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x5y3[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y3[] = {
  {&(_ZTV6G8x5y3[6]),  6,17},
  {&(_ZTV6G8x5y3[10]),  10,17},
  {&(_ZTV6G8x5y3[13]),  13,17},
  {&(_ZTV6G8x5y3[16]),  16,17},
  {&(_tg__ZTV4E8x5__6G8x5y3[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y3[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x5y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y3[];
extern  VTBL_ENTRY _ZTV6G8x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y3[];
Class_Descriptor cd_G8x5y3 = {  "G8x5y3", // class name
  bases_G8x5y3, 6,
  &(vtc_G8x5y3[0]), // expected_vtbl_contents
  &(vtt_G8x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G8x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y3),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y4  : E8x5 , F0 {
  int ff;
  ~G8x5y4(); // tgen
  G8x5y4(); // tgen
};
//SIG(1 G8x5y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G8x5y4 ::~G8x5y4(){ note_dtor("G8x5y4", this);} // tgen
G8x5y4 ::G8x5y4(){ note_ctor("G8x5y4", this);} // tgen

static void Test_G8x5y4()
{
  extern Class_Descriptor cd_G8x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x5y4, buf);
    G8x5y4 *dp, &lv = *(dp=new (buf) G8x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y4)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,24), "G8x5y4");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,32), "G8x5y4");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(24,20), "G8x5y4");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(8,4), "G8x5y4");
    check_base_class_offset(lv, (E8x5*), 0, "G8x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G8x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G8x5y4.ff");
    test_class_info(&lv, &cd_G8x5y4);
    dp->~G8x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y4(Test_G8x5y4, "G8x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x5y4C1Ev();
extern void _ZN6G8x5y4D1Ev();
Name_Map name_map_G8x5y4[] = {
  NSPAIR(_ZN6G8x5y4C1Ev),
  NSPAIR(_ZN6G8x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y4[];
static  VTBL_ENTRY vtc_G8x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G8x5y4[0]),
};
extern VTBL_ENTRY _ZTV6G8x5y4[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y4[] = {
  {&(_ZTV6G8x5y4[4]),  4,7},
  {&(_tg__ZTV4E8x5__6G8x5y4[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y4[3]),  3,3},
  {&(_ZTV6G8x5y4[7]),  7,7},
  {&(_tg__ZTV2C8__6G8x5y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y4[];
extern  VTBL_ENTRY _ZTV6G8x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y4[];
Class_Descriptor cd_G8x5y4 = {  "G8x5y4", // class name
  bases_G8x5y4, 6,
  &(vtc_G8x5y4[0]), // expected_vtbl_contents
  &(vtt_G8x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y4),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y5  : virtual E8x5 , F0 {
  int ff;
  ~G8x5y5(); // tgen
  G8x5y5(); // tgen
};
//SIG(1 G8x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G8x5y5 ::~G8x5y5(){ note_dtor("G8x5y5", this);} // tgen
G8x5y5 ::G8x5y5(){ note_ctor("G8x5y5", this);} // tgen

static void Test_G8x5y5()
{
  extern Class_Descriptor cd_G8x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x5y5, buf);
    G8x5y5 *dp, &lv = *(dp=new (buf) G8x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y5)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,28), "G8x5y5");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,36), "G8x5y5");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(32,24), "G8x5y5");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(24,16), "G8x5y5");
    check_base_class_offset(lv, (E8x5*), ABISELECT(16,12), "G8x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x5y5.ff");
    test_class_info(&lv, &cd_G8x5y5);
    dp->~G8x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y5(Test_G8x5y5, "G8x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x5y5C1Ev();
extern void _ZN6G8x5y5D1Ev();
Name_Map name_map_G8x5y5[] = {
  NSPAIR(_ZN6G8x5y5C1Ev),
  NSPAIR(_ZN6G8x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y5[];
static  VTBL_ENTRY vtc_G8x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G8x5y5[0]),
};
extern VTBL_ENTRY _ZTV6G8x5y5[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y5[] = {
  {&(_ZTV6G8x5y5[5]),  5,12},
  {&(_ZTV6G8x5y5[9]),  9,12},
  {&(_ZTV6G8x5y5[12]),  12,12},
  {&(_tg__ZTV4E8x5__6G8x5y5[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y5[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x5y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y5[];
extern  VTBL_ENTRY _ZTV6G8x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y5[];
Class_Descriptor cd_G8x5y5 = {  "G8x5y5", // class name
  bases_G8x5y5, 6,
  &(vtc_G8x5y5[0]), // expected_vtbl_contents
  &(vtt_G8x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y5),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y6  : E8x5 , virtual F0 {
  int ff;
  ~G8x5y6(); // tgen
  G8x5y6(); // tgen
};
//SIG(1 G8x5y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x5y6 ::~G8x5y6(){ note_dtor("G8x5y6", this);} // tgen
G8x5y6 ::G8x5y6(){ note_ctor("G8x5y6", this);} // tgen

static void Test_G8x5y6()
{
  extern Class_Descriptor cd_G8x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x5y6, buf);
    G8x5y6 *dp, &lv = *(dp=new (buf) G8x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y6)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,20), "G8x5y6");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,28), "G8x5y6");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(24,16), "G8x5y6");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(8,4), "G8x5y6");
    check_base_class_offset(lv, (E8x5*), 0, "G8x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G8x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G8x5y6.ff");
    test_class_info(&lv, &cd_G8x5y6);
    dp->~G8x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y6(Test_G8x5y6, "G8x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x5y6C1Ev();
extern void _ZN6G8x5y6D1Ev();
Name_Map name_map_G8x5y6[] = {
  NSPAIR(_ZN6G8x5y6C1Ev),
  NSPAIR(_ZN6G8x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y6[];
static  VTBL_ENTRY vtc_G8x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y6[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G8x5y6[0]),
};
extern VTBL_ENTRY _ZTV6G8x5y6[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y6[] = {
  {&(_ZTV6G8x5y6[5]),  5,8},
  {&(_tg__ZTV4E8x5__6G8x5y6[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y6[3]),  3,3},
  {&(_ZTV6G8x5y6[8]),  8,8},
  {&(_tg__ZTV2C8__6G8x5y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y6[];
extern  VTBL_ENTRY _ZTV6G8x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y6[];
Class_Descriptor cd_G8x5y6 = {  "G8x5y6", // class name
  bases_G8x5y6, 6,
  &(vtc_G8x5y6[0]), // expected_vtbl_contents
  &(vtt_G8x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y6),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x5y7  : virtual E8x5 , virtual F0 {
  int ff;
  ~G8x5y7(); // tgen
  G8x5y7(); // tgen
};
//SIG(1 G8x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x5y7 ::~G8x5y7(){ note_dtor("G8x5y7", this);} // tgen
G8x5y7 ::G8x5y7(){ note_ctor("G8x5y7", this);} // tgen

static void Test_G8x5y7()
{
  extern Class_Descriptor cd_G8x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x5y7, buf);
    G8x5y7 *dp, &lv = *(dp=new (buf) G8x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x5y7)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x5y7");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x5y7");
    check_base_class_offset(lv, (C8*)(E8x5*), ABISELECT(32,20), "G8x5y7");
    check_base_class_offset(lv, (D0*)(E8x5*), ABISELECT(24,12), "G8x5y7");
    check_base_class_offset(lv, (E8x5*), ABISELECT(16,8), "G8x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G8x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x5y7.ff");
    test_class_info(&lv, &cd_G8x5y7);
    dp->~G8x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x5y7(Test_G8x5y7, "G8x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x5y7C1Ev();
extern void _ZN6G8x5y7D1Ev();
Name_Map name_map_G8x5y7[] = {
  NSPAIR(_ZN6G8x5y7C1Ev),
  NSPAIR(_ZN6G8x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x5;
extern VTBL_ENTRY _ZTI4E8x5[];
extern  VTBL_ENTRY _ZTV4E8x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E8x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x5y7[];
static  VTBL_ENTRY vtc_G8x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G8x5y7[0]),
};
extern VTBL_ENTRY _ZTV6G8x5y7[];
static  VTBL_ENTRY _tg__ZTV4E8x5__6G8x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x5__6G8x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x5[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x5y7[] = {
  {&(_ZTV6G8x5y7[6]),  6,13},
  {&(_ZTV6G8x5y7[10]),  10,13},
  {&(_ZTV6G8x5y7[13]),  13,13},
  {&(_tg__ZTV4E8x5__6G8x5y7[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x5__6G8x5y7[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x5y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x5y7[];
extern  VTBL_ENTRY _ZTV6G8x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x5y7[];
Class_Descriptor cd_G8x5y7 = {  "G8x5y7", // class name
  bases_G8x5y7, 6,
  &(vtc_G8x5y7[0]), // expected_vtbl_contents
  &(vtt_G8x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x5y7),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x5y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E9x5  : virtual C9 , D0 {
  int fd;
  ~E9x5(); // tgen
  E9x5(); // tgen
};
//SIG(-1 E9x5) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E9x5 ::~E9x5(){ note_dtor("E9x5", this);} // tgen
E9x5 ::E9x5(){ note_ctor("E9x5", this);} // tgen

static void Test_E9x5()
{
  extern Class_Descriptor cd_E9x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E9x5, buf);
    E9x5 *dp, &lv = *(dp=new (buf) E9x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E9x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x5)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,12), "E9x5");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,24), "E9x5");
    check_base_class_offset(lv, (C9*), ABISELECT(16,12), "E9x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E9x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E9x5.fd");
    test_class_info(&lv, &cd_E9x5);
    dp->~E9x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x5(Test_E9x5, "E9x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E9x5C1Ev();
extern void _ZN4E9x5D1Ev();
Name_Map name_map_E9x5[] = {
  NSPAIR(_ZN4E9x5C1Ev),
  NSPAIR(_ZN4E9x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E9x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI4E9x5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E9x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E9x5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x5[] = {
  {&(_ZTV4E9x5[4]),  4,9},
  {&(_ZTV4E9x5[8]),  8,9},
  {&(_tg__ZTV2C9__4E9x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
Class_Descriptor cd_E9x5 = {  "E9x5", // class name
  bases_E9x5, 4,
  &(vtc_E9x5[0]), // expected_vtbl_contents
  &(vtt_E9x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E9x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E9x5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E9x5),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y0  : E9x5 , F1 {
  int ff;
  ~G9x5y0(); // tgen
  G9x5y0(); // tgen
};
//SIG(1 G9x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x5y0 ::~G9x5y0(){ note_dtor("G9x5y0", this);} // tgen
G9x5y0 ::G9x5y0(){ note_ctor("G9x5y0", this);} // tgen

static void Test_G9x5y0()
{
  extern Class_Descriptor cd_G9x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x5y0, buf);
    G9x5y0 *dp, &lv = *(dp=new (buf) G9x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y0)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,24), "G9x5y0");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,36), "G9x5y0");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(32,24), "G9x5y0");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(8,4), "G9x5y0");
    check_base_class_offset(lv, (E9x5*), 0, "G9x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G9x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G9x5y0.ff");
    test_class_info(&lv, &cd_G9x5y0);
    dp->~G9x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y0(Test_G9x5y0, "G9x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x5y0C1Ev();
extern void _ZN6G9x5y0D1Ev();
Name_Map name_map_G9x5y0[] = {
  NSPAIR(_ZN6G9x5y0C1Ev),
  NSPAIR(_ZN6G9x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G9x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y0[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y0[] = {
  {&(_ZTV6G9x5y0[4]),  4,12},
  {&(_tg__ZTV4E9x5__6G9x5y0[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y0[4]),  4,5},
  {&(_ZTV6G9x5y0[11]),  11,12},
  {&(_tg__ZTV2C9__6G9x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y0[];
extern  VTBL_ENTRY _ZTV6G9x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y0[];
Class_Descriptor cd_G9x5y0 = {  "G9x5y0", // class name
  bases_G9x5y0, 6,
  &(vtc_G9x5y0[0]), // expected_vtbl_contents
  &(vtt_G9x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y1  : virtual E9x5 , F1 {
  int ff;
  ~G9x5y1(); // tgen
  G9x5y1(); // tgen
};
//SIG(1 G9x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x5y1 ::~G9x5y1(){ note_dtor("G9x5y1", this);} // tgen
G9x5y1 ::G9x5y1(){ note_ctor("G9x5y1", this);} // tgen

static void Test_G9x5y1()
{
  extern Class_Descriptor cd_G9x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x5y1, buf);
    G9x5y1 *dp, &lv = *(dp=new (buf) G9x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y1)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,24), "G9x5y1");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,36), "G9x5y1");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(32,24), "G9x5y1");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(24,16), "G9x5y1");
    check_base_class_offset(lv, (E9x5*), ABISELECT(16,12), "G9x5y1");
    check_base_class_offset(lv, (F1*), 0, "G9x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x5y1.ff");
    test_class_info(&lv, &cd_G9x5y1);
    dp->~G9x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y1(Test_G9x5y1, "G9x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x5y1C1Ev();
extern void _ZN6G9x5y1D1Ev();
Name_Map name_map_G9x5y1[] = {
  NSPAIR(_ZN6G9x5y1C1Ev),
  NSPAIR(_ZN6G9x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G9x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y1[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y1[] = {
  {&(_ZTV6G9x5y1[5]),  5,15},
  {&(_ZTV6G9x5y1[10]),  10,15},
  {&(_ZTV6G9x5y1[14]),  14,15},
  {&(_tg__ZTV4E9x5__6G9x5y1[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y1[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y1[];
extern  VTBL_ENTRY _ZTV6G9x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y1[];
Class_Descriptor cd_G9x5y1 = {  "G9x5y1", // class name
  bases_G9x5y1, 6,
  &(vtc_G9x5y1[0]), // expected_vtbl_contents
  &(vtt_G9x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y2  : E9x5 , virtual F1 {
  int ff;
  ~G9x5y2(); // tgen
  G9x5y2(); // tgen
};
//SIG(1 G9x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x5y2 ::~G9x5y2(){ note_dtor("G9x5y2", this);} // tgen
G9x5y2 ::G9x5y2(){ note_ctor("G9x5y2", this);} // tgen

static void Test_G9x5y2()
{
  extern Class_Descriptor cd_G9x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x5y2, buf);
    G9x5y2 *dp, &lv = *(dp=new (buf) G9x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y2)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,16), "G9x5y2");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,28), "G9x5y2");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(24,16), "G9x5y2");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(8,4), "G9x5y2");
    check_base_class_offset(lv, (E9x5*), 0, "G9x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G9x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G9x5y2.ff");
    test_class_info(&lv, &cd_G9x5y2);
    dp->~G9x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y2(Test_G9x5y2, "G9x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G9x5y2C1Ev();
extern void _ZN6G9x5y2D1Ev();
Name_Map name_map_G9x5y2[] = {
  NSPAIR(_ZN6G9x5y2C1Ev),
  NSPAIR(_ZN6G9x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G9x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G9x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y2[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y2[] = {
  {&(_ZTV6G9x5y2[5]),  5,14},
  {&(_tg__ZTV4E9x5__6G9x5y2[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y2[4]),  4,5},
  {&(_ZTV6G9x5y2[9]),  9,14},
  {&(_ZTV6G9x5y2[13]),  13,14},
  {&(_tg__ZTV2C9__6G9x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y2[];
extern  VTBL_ENTRY _ZTV6G9x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y2[];
Class_Descriptor cd_G9x5y2 = {  "G9x5y2", // class name
  bases_G9x5y2, 6,
  &(vtc_G9x5y2[0]), // expected_vtbl_contents
  &(vtt_G9x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G9x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y3  : virtual E9x5 , virtual F1 {
  int ff;
  ~G9x5y3(); // tgen
  G9x5y3(); // tgen
};
//SIG(1 G9x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x5y3 ::~G9x5y3(){ note_dtor("G9x5y3", this);} // tgen
G9x5y3 ::G9x5y3(){ note_ctor("G9x5y3", this);} // tgen

static void Test_G9x5y3()
{
  extern Class_Descriptor cd_G9x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G9x5y3, buf);
    G9x5y3 *dp, &lv = *(dp=new (buf) G9x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G9x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y3)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x5y3");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x5y3");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(32,20), "G9x5y3");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(24,12), "G9x5y3");
    check_base_class_offset(lv, (E9x5*), ABISELECT(16,8), "G9x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G9x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x5y3.ff");
    test_class_info(&lv, &cd_G9x5y3);
    dp->~G9x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y3(Test_G9x5y3, "G9x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G9x5y3C1Ev();
extern void _ZN6G9x5y3D1Ev();
Name_Map name_map_G9x5y3[] = {
  NSPAIR(_ZN6G9x5y3C1Ev),
  NSPAIR(_ZN6G9x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G9x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G9x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y3[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y3[] = {
  {&(_ZTV6G9x5y3[6]),  6,19},
  {&(_ZTV6G9x5y3[10]),  10,19},
  {&(_ZTV6G9x5y3[14]),  14,19},
  {&(_ZTV6G9x5y3[18]),  18,19},
  {&(_tg__ZTV4E9x5__6G9x5y3[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y3[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y3[];
extern  VTBL_ENTRY _ZTV6G9x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y3[];
Class_Descriptor cd_G9x5y3 = {  "G9x5y3", // class name
  bases_G9x5y3, 6,
  &(vtc_G9x5y3[0]), // expected_vtbl_contents
  &(vtt_G9x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G9x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y4  : E9x5 , F0 {
  int ff;
  ~G9x5y4(); // tgen
  G9x5y4(); // tgen
};
//SIG(1 G9x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G9x5y4 ::~G9x5y4(){ note_dtor("G9x5y4", this);} // tgen
G9x5y4 ::G9x5y4(){ note_ctor("G9x5y4", this);} // tgen

static void Test_G9x5y4()
{
  extern Class_Descriptor cd_G9x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x5y4, buf);
    G9x5y4 *dp, &lv = *(dp=new (buf) G9x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y4)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,20), "G9x5y4");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,32), "G9x5y4");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(24,20), "G9x5y4");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(8,4), "G9x5y4");
    check_base_class_offset(lv, (E9x5*), 0, "G9x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G9x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G9x5y4.ff");
    test_class_info(&lv, &cd_G9x5y4);
    dp->~G9x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y4(Test_G9x5y4, "G9x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x5y4C1Ev();
extern void _ZN6G9x5y4D1Ev();
Name_Map name_map_G9x5y4[] = {
  NSPAIR(_ZN6G9x5y4C1Ev),
  NSPAIR(_ZN6G9x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G9x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y4[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y4[] = {
  {&(_ZTV6G9x5y4[4]),  4,9},
  {&(_tg__ZTV4E9x5__6G9x5y4[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y4[4]),  4,5},
  {&(_ZTV6G9x5y4[8]),  8,9},
  {&(_tg__ZTV2C9__6G9x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y4[];
extern  VTBL_ENTRY _ZTV6G9x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y4[];
Class_Descriptor cd_G9x5y4 = {  "G9x5y4", // class name
  bases_G9x5y4, 6,
  &(vtc_G9x5y4[0]), // expected_vtbl_contents
  &(vtt_G9x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y5  : virtual E9x5 , F0 {
  int ff;
  ~G9x5y5(); // tgen
  G9x5y5(); // tgen
};
//SIG(1 G9x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G9x5y5 ::~G9x5y5(){ note_dtor("G9x5y5", this);} // tgen
G9x5y5 ::G9x5y5(){ note_ctor("G9x5y5", this);} // tgen

static void Test_G9x5y5()
{
  extern Class_Descriptor cd_G9x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x5y5, buf);
    G9x5y5 *dp, &lv = *(dp=new (buf) G9x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y5)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,24), "G9x5y5");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,36), "G9x5y5");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(32,24), "G9x5y5");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(24,16), "G9x5y5");
    check_base_class_offset(lv, (E9x5*), ABISELECT(16,12), "G9x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x5y5.ff");
    test_class_info(&lv, &cd_G9x5y5);
    dp->~G9x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y5(Test_G9x5y5, "G9x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x5y5C1Ev();
extern void _ZN6G9x5y5D1Ev();
Name_Map name_map_G9x5y5[] = {
  NSPAIR(_ZN6G9x5y5C1Ev),
  NSPAIR(_ZN6G9x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G9x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y5[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y5[] = {
  {&(_ZTV6G9x5y5[5]),  5,14},
  {&(_ZTV6G9x5y5[9]),  9,14},
  {&(_ZTV6G9x5y5[13]),  13,14},
  {&(_tg__ZTV4E9x5__6G9x5y5[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y5[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y5[];
extern  VTBL_ENTRY _ZTV6G9x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y5[];
Class_Descriptor cd_G9x5y5 = {  "G9x5y5", // class name
  bases_G9x5y5, 6,
  &(vtc_G9x5y5[0]), // expected_vtbl_contents
  &(vtt_G9x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y6  : E9x5 , virtual F0 {
  int ff;
  ~G9x5y6(); // tgen
  G9x5y6(); // tgen
};
//SIG(1 G9x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x5y6 ::~G9x5y6(){ note_dtor("G9x5y6", this);} // tgen
G9x5y6 ::G9x5y6(){ note_ctor("G9x5y6", this);} // tgen

static void Test_G9x5y6()
{
  extern Class_Descriptor cd_G9x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x5y6, buf);
    G9x5y6 *dp, &lv = *(dp=new (buf) G9x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y6)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,16), "G9x5y6");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,28), "G9x5y6");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(24,16), "G9x5y6");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(8,4), "G9x5y6");
    check_base_class_offset(lv, (E9x5*), 0, "G9x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G9x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G9x5y6.ff");
    test_class_info(&lv, &cd_G9x5y6);
    dp->~G9x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y6(Test_G9x5y6, "G9x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x5y6C1Ev();
extern void _ZN6G9x5y6D1Ev();
Name_Map name_map_G9x5y6[] = {
  NSPAIR(_ZN6G9x5y6C1Ev),
  NSPAIR(_ZN6G9x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G9x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y6[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y6[] = {
  {&(_ZTV6G9x5y6[5]),  5,10},
  {&(_tg__ZTV4E9x5__6G9x5y6[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y6[4]),  4,5},
  {&(_ZTV6G9x5y6[9]),  9,10},
  {&(_tg__ZTV2C9__6G9x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y6[];
extern  VTBL_ENTRY _ZTV6G9x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y6[];
Class_Descriptor cd_G9x5y6 = {  "G9x5y6", // class name
  bases_G9x5y6, 6,
  &(vtc_G9x5y6[0]), // expected_vtbl_contents
  &(vtt_G9x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x5y7  : virtual E9x5 , virtual F0 {
  int ff;
  ~G9x5y7(); // tgen
  G9x5y7(); // tgen
};
//SIG(1 G9x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x5y7 ::~G9x5y7(){ note_dtor("G9x5y7", this);} // tgen
G9x5y7 ::G9x5y7(){ note_ctor("G9x5y7", this);} // tgen

static void Test_G9x5y7()
{
  extern Class_Descriptor cd_G9x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x5y7, buf);
    G9x5y7 *dp, &lv = *(dp=new (buf) G9x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x5y7)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x5y7");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x5y7");
    check_base_class_offset(lv, (C9*)(E9x5*), ABISELECT(32,20), "G9x5y7");
    check_base_class_offset(lv, (D0*)(E9x5*), ABISELECT(24,12), "G9x5y7");
    check_base_class_offset(lv, (E9x5*), ABISELECT(16,8), "G9x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G9x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x5y7.ff");
    test_class_info(&lv, &cd_G9x5y7);
    dp->~G9x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x5y7(Test_G9x5y7, "G9x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x5y7C1Ev();
extern void _ZN6G9x5y7D1Ev();
Name_Map name_map_G9x5y7[] = {
  NSPAIR(_ZN6G9x5y7C1Ev),
  NSPAIR(_ZN6G9x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x5;
extern VTBL_ENTRY _ZTI4E9x5[];
extern  VTBL_ENTRY _ZTV4E9x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E9x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x5y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G9x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x5y7[];
static  VTBL_ENTRY _tg__ZTV4E9x5__6G9x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x5__6G9x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x5y7[] = {
  {&(_ZTV6G9x5y7[6]),  6,15},
  {&(_ZTV6G9x5y7[10]),  10,15},
  {&(_ZTV6G9x5y7[14]),  14,15},
  {&(_tg__ZTV4E9x5__6G9x5y7[4]),  4,4},
  {&(_tg__ZTV2C9__4E9x5__6G9x5y7[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x5y7[];
extern  VTBL_ENTRY _ZTV6G9x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x5y7[];
Class_Descriptor cd_G9x5y7 = {  "G9x5y7", // class name
  bases_G9x5y7, 6,
  &(vtc_G9x5y7[0]), // expected_vtbl_contents
  &(vtt_G9x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x5y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x5y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E10x5  : virtual C10 , D0 {
  int fd;
  ~E10x5(); // tgen
  E10x5(); // tgen
};
//SIG(-1 E10x5) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E10x5 ::~E10x5(){ note_dtor("E10x5", this);} // tgen
E10x5 ::E10x5(){ note_ctor("E10x5", this);} // tgen

static void Test_E10x5()
{
  extern Class_Descriptor cd_E10x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E10x5, buf);
    E10x5 *dp, &lv = *(dp=new (buf) E10x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E10x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x5)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,20), "E10x5");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,24), "E10x5");
    check_base_class_offset(lv, (C10*), ABISELECT(16,12), "E10x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E10x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E10x5.fd");
    test_class_info(&lv, &cd_E10x5);
    dp->~E10x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x5(Test_E10x5, "E10x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E10x5C1Ev();
extern void _ZN5E10x5D1Ev();
Name_Map name_map_E10x5[] = {
  NSPAIR(_ZN5E10x5C1Ev),
  NSPAIR(_ZN5E10x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E10x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E10x5[];
static  VTBL_ENTRY vtc_E10x5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
extern VTBL_ENTRY _ZTV5E10x5[];
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x5[] = {
  {&(_ZTV5E10x5[5]),  5,9},
  {&(_ZTV5E10x5[9]),  9,9},
  {&(_tg__ZTV3C10__5E10x5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
Class_Descriptor cd_E10x5 = {  "E10x5", // class name
  bases_E10x5, 4,
  &(vtc_E10x5[0]), // expected_vtbl_contents
  &(vtt_E10x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E10x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E10x5),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E10x5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y0  : E10x5 , F1 {
  int ff;
  ~G10x5y0(); // tgen
  G10x5y0(); // tgen
};
//SIG(1 G10x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x5y0 ::~G10x5y0(){ note_dtor("G10x5y0", this);} // tgen
G10x5y0 ::G10x5y0(){ note_ctor("G10x5y0", this);} // tgen

static void Test_G10x5y0()
{
  extern Class_Descriptor cd_G10x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x5y0, buf);
    G10x5y0 *dp, &lv = *(dp=new (buf) G10x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y0)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,32), "G10x5y0");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,36), "G10x5y0");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(32,24), "G10x5y0");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(8,4), "G10x5y0");
    check_base_class_offset(lv, (E10x5*), 0, "G10x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G10x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G10x5y0.ff");
    test_class_info(&lv, &cd_G10x5y0);
    dp->~G10x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y0(Test_G10x5y0, "G10x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x5y0C1Ev();
extern void _ZN7G10x5y0D1Ev();
Name_Map name_map_G10x5y0[] = {
  NSPAIR(_ZN7G10x5y0C1Ev),
  NSPAIR(_ZN7G10x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G10x5y0[0]),
};
extern VTBL_ENTRY _ZTV7G10x5y0[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y0[] = {
  {&(_ZTV7G10x5y0[5]),  5,12},
  {&(_tg__ZTV5E10x5__7G10x5y0[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y0[4]),  4,4},
  {&(_ZTV7G10x5y0[12]),  12,12},
  {&(_tg__ZTV3C10__7G10x5y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y0[];
extern  VTBL_ENTRY _ZTV7G10x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y0[];
Class_Descriptor cd_G10x5y0 = {  "G10x5y0", // class name
  bases_G10x5y0, 6,
  &(vtc_G10x5y0[0]), // expected_vtbl_contents
  &(vtt_G10x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y0),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y1  : virtual E10x5 , F1 {
  int ff;
  ~G10x5y1(); // tgen
  G10x5y1(); // tgen
};
//SIG(1 G10x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x5y1 ::~G10x5y1(){ note_dtor("G10x5y1", this);} // tgen
G10x5y1 ::G10x5y1(){ note_ctor("G10x5y1", this);} // tgen

static void Test_G10x5y1()
{
  extern Class_Descriptor cd_G10x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x5y1, buf);
    G10x5y1 *dp, &lv = *(dp=new (buf) G10x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y1)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,32), "G10x5y1");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,36), "G10x5y1");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(32,24), "G10x5y1");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(24,16), "G10x5y1");
    check_base_class_offset(lv, (E10x5*), ABISELECT(16,12), "G10x5y1");
    check_base_class_offset(lv, (F1*), 0, "G10x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x5y1.ff");
    test_class_info(&lv, &cd_G10x5y1);
    dp->~G10x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y1(Test_G10x5y1, "G10x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x5y1C1Ev();
extern void _ZN7G10x5y1D1Ev();
Name_Map name_map_G10x5y1[] = {
  NSPAIR(_ZN7G10x5y1C1Ev),
  NSPAIR(_ZN7G10x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x5y1[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G10x5y1[0]),
};
extern VTBL_ENTRY _ZTV7G10x5y1[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y1[] = {
  {&(_ZTV7G10x5y1[6]),  6,16},
  {&(_ZTV7G10x5y1[12]),  12,16},
  {&(_ZTV7G10x5y1[16]),  16,16},
  {&(_tg__ZTV5E10x5__7G10x5y1[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y1[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x5y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y1[];
extern  VTBL_ENTRY _ZTV7G10x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y1[];
Class_Descriptor cd_G10x5y1 = {  "G10x5y1", // class name
  bases_G10x5y1, 6,
  &(vtc_G10x5y1[0]), // expected_vtbl_contents
  &(vtt_G10x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y1),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y2  : E10x5 , virtual F1 {
  int ff;
  ~G10x5y2(); // tgen
  G10x5y2(); // tgen
};
//SIG(1 G10x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x5y2 ::~G10x5y2(){ note_dtor("G10x5y2", this);} // tgen
G10x5y2 ::G10x5y2(){ note_ctor("G10x5y2", this);} // tgen

static void Test_G10x5y2()
{
  extern Class_Descriptor cd_G10x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x5y2, buf);
    G10x5y2 *dp, &lv = *(dp=new (buf) G10x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y2)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,24), "G10x5y2");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,28), "G10x5y2");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(24,16), "G10x5y2");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(8,4), "G10x5y2");
    check_base_class_offset(lv, (E10x5*), 0, "G10x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G10x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x5y2.ff");
    test_class_info(&lv, &cd_G10x5y2);
    dp->~G10x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y2(Test_G10x5y2, "G10x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G10x5y2C1Ev();
extern void _ZN7G10x5y2D1Ev();
Name_Map name_map_G10x5y2[] = {
  NSPAIR(_ZN7G10x5y2C1Ev),
  NSPAIR(_ZN7G10x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y2[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G10x5y2[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G10x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x5y2[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y2[] = {
  {&(_ZTV7G10x5y2[6]),  6,14},
  {&(_tg__ZTV5E10x5__7G10x5y2[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y2[4]),  4,4},
  {&(_ZTV7G10x5y2[10]),  10,14},
  {&(_ZTV7G10x5y2[13]),  13,14},
  {&(_tg__ZTV3C10__7G10x5y2[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y2[];
extern  VTBL_ENTRY _ZTV7G10x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y2[];
Class_Descriptor cd_G10x5y2 = {  "G10x5y2", // class name
  bases_G10x5y2, 6,
  &(vtc_G10x5y2[0]), // expected_vtbl_contents
  &(vtt_G10x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G10x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y2),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y3  : virtual E10x5 , virtual F1 {
  int ff;
  ~G10x5y3(); // tgen
  G10x5y3(); // tgen
};
//SIG(1 G10x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x5y3 ::~G10x5y3(){ note_dtor("G10x5y3", this);} // tgen
G10x5y3 ::G10x5y3(){ note_ctor("G10x5y3", this);} // tgen

static void Test_G10x5y3()
{
  extern Class_Descriptor cd_G10x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G10x5y3, buf);
    G10x5y3 *dp, &lv = *(dp=new (buf) G10x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G10x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y3)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x5y3");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x5y3");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(32,20), "G10x5y3");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(24,12), "G10x5y3");
    check_base_class_offset(lv, (E10x5*), ABISELECT(16,8), "G10x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G10x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x5y3.ff");
    test_class_info(&lv, &cd_G10x5y3);
    dp->~G10x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y3(Test_G10x5y3, "G10x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G10x5y3C1Ev();
extern void _ZN7G10x5y3D1Ev();
Name_Map name_map_G10x5y3[] = {
  NSPAIR(_ZN7G10x5y3C1Ev),
  NSPAIR(_ZN7G10x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G10x5y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G10x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x5y3[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y3[] = {
  {&(_ZTV7G10x5y3[7]),  7,20},
  {&(_ZTV7G10x5y3[12]),  12,20},
  {&(_ZTV7G10x5y3[16]),  16,20},
  {&(_ZTV7G10x5y3[19]),  19,20},
  {&(_tg__ZTV5E10x5__7G10x5y3[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y3[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x5y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y3[];
extern  VTBL_ENTRY _ZTV7G10x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y3[];
Class_Descriptor cd_G10x5y3 = {  "G10x5y3", // class name
  bases_G10x5y3, 6,
  &(vtc_G10x5y3[0]), // expected_vtbl_contents
  &(vtt_G10x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G10x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y3),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y4  : E10x5 , F0 {
  int ff;
  ~G10x5y4(); // tgen
  G10x5y4(); // tgen
};
//SIG(1 G10x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G10x5y4 ::~G10x5y4(){ note_dtor("G10x5y4", this);} // tgen
G10x5y4 ::G10x5y4(){ note_ctor("G10x5y4", this);} // tgen

static void Test_G10x5y4()
{
  extern Class_Descriptor cd_G10x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x5y4, buf);
    G10x5y4 *dp, &lv = *(dp=new (buf) G10x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y4)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,28), "G10x5y4");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,32), "G10x5y4");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(24,20), "G10x5y4");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(8,4), "G10x5y4");
    check_base_class_offset(lv, (E10x5*), 0, "G10x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G10x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x5y4.ff");
    test_class_info(&lv, &cd_G10x5y4);
    dp->~G10x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y4(Test_G10x5y4, "G10x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x5y4C1Ev();
extern void _ZN7G10x5y4D1Ev();
Name_Map name_map_G10x5y4[] = {
  NSPAIR(_ZN7G10x5y4C1Ev),
  NSPAIR(_ZN7G10x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y4[];
static  VTBL_ENTRY vtc_G10x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y4[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G10x5y4[0]),
};
extern VTBL_ENTRY _ZTV7G10x5y4[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y4[] = {
  {&(_ZTV7G10x5y4[5]),  5,9},
  {&(_tg__ZTV5E10x5__7G10x5y4[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y4[4]),  4,4},
  {&(_ZTV7G10x5y4[9]),  9,9},
  {&(_tg__ZTV3C10__7G10x5y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y4[];
extern  VTBL_ENTRY _ZTV7G10x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y4[];
Class_Descriptor cd_G10x5y4 = {  "G10x5y4", // class name
  bases_G10x5y4, 6,
  &(vtc_G10x5y4[0]), // expected_vtbl_contents
  &(vtt_G10x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y4),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y5  : virtual E10x5 , F0 {
  int ff;
  ~G10x5y5(); // tgen
  G10x5y5(); // tgen
};
//SIG(1 G10x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G10x5y5 ::~G10x5y5(){ note_dtor("G10x5y5", this);} // tgen
G10x5y5 ::G10x5y5(){ note_ctor("G10x5y5", this);} // tgen

static void Test_G10x5y5()
{
  extern Class_Descriptor cd_G10x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x5y5, buf);
    G10x5y5 *dp, &lv = *(dp=new (buf) G10x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y5)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,32), "G10x5y5");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,36), "G10x5y5");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(32,24), "G10x5y5");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(24,16), "G10x5y5");
    check_base_class_offset(lv, (E10x5*), ABISELECT(16,12), "G10x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x5y5.ff");
    test_class_info(&lv, &cd_G10x5y5);
    dp->~G10x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y5(Test_G10x5y5, "G10x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x5y5C1Ev();
extern void _ZN7G10x5y5D1Ev();
Name_Map name_map_G10x5y5[] = {
  NSPAIR(_ZN7G10x5y5C1Ev),
  NSPAIR(_ZN7G10x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y5[];
static  VTBL_ENTRY vtc_G10x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G10x5y5[0]),
};
extern VTBL_ENTRY _ZTV7G10x5y5[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y5[] = {
  {&(_ZTV7G10x5y5[6]),  6,15},
  {&(_ZTV7G10x5y5[11]),  11,15},
  {&(_ZTV7G10x5y5[15]),  15,15},
  {&(_tg__ZTV5E10x5__7G10x5y5[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y5[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x5y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y5[];
extern  VTBL_ENTRY _ZTV7G10x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y5[];
Class_Descriptor cd_G10x5y5 = {  "G10x5y5", // class name
  bases_G10x5y5, 6,
  &(vtc_G10x5y5[0]), // expected_vtbl_contents
  &(vtt_G10x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y5),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y6  : E10x5 , virtual F0 {
  int ff;
  ~G10x5y6(); // tgen
  G10x5y6(); // tgen
};
//SIG(1 G10x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x5y6 ::~G10x5y6(){ note_dtor("G10x5y6", this);} // tgen
G10x5y6 ::G10x5y6(){ note_ctor("G10x5y6", this);} // tgen

static void Test_G10x5y6()
{
  extern Class_Descriptor cd_G10x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x5y6, buf);
    G10x5y6 *dp, &lv = *(dp=new (buf) G10x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y6)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,24), "G10x5y6");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,28), "G10x5y6");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(24,16), "G10x5y6");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(8,4), "G10x5y6");
    check_base_class_offset(lv, (E10x5*), 0, "G10x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G10x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x5y6.ff");
    test_class_info(&lv, &cd_G10x5y6);
    dp->~G10x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y6(Test_G10x5y6, "G10x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x5y6C1Ev();
extern void _ZN7G10x5y6D1Ev();
Name_Map name_map_G10x5y6[] = {
  NSPAIR(_ZN7G10x5y6C1Ev),
  NSPAIR(_ZN7G10x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y6[];
static  VTBL_ENTRY vtc_G10x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y6[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G10x5y6[0]),
};
extern VTBL_ENTRY _ZTV7G10x5y6[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y6[] = {
  {&(_ZTV7G10x5y6[6]),  6,10},
  {&(_tg__ZTV5E10x5__7G10x5y6[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y6[4]),  4,4},
  {&(_ZTV7G10x5y6[10]),  10,10},
  {&(_tg__ZTV3C10__7G10x5y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y6[];
extern  VTBL_ENTRY _ZTV7G10x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y6[];
Class_Descriptor cd_G10x5y6 = {  "G10x5y6", // class name
  bases_G10x5y6, 6,
  &(vtc_G10x5y6[0]), // expected_vtbl_contents
  &(vtt_G10x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y6),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x5y7  : virtual E10x5 , virtual F0 {
  int ff;
  ~G10x5y7(); // tgen
  G10x5y7(); // tgen
};
//SIG(1 G10x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x5y7 ::~G10x5y7(){ note_dtor("G10x5y7", this);} // tgen
G10x5y7 ::G10x5y7(){ note_ctor("G10x5y7", this);} // tgen

static void Test_G10x5y7()
{
  extern Class_Descriptor cd_G10x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x5y7, buf);
    G10x5y7 *dp, &lv = *(dp=new (buf) G10x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x5y7)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x5y7");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x5y7");
    check_base_class_offset(lv, (C10*)(E10x5*), ABISELECT(32,20), "G10x5y7");
    check_base_class_offset(lv, (D0*)(E10x5*), ABISELECT(24,12), "G10x5y7");
    check_base_class_offset(lv, (E10x5*), ABISELECT(16,8), "G10x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G10x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x5y7.ff");
    test_class_info(&lv, &cd_G10x5y7);
    dp->~G10x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x5y7(Test_G10x5y7, "G10x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x5y7C1Ev();
extern void _ZN7G10x5y7D1Ev();
Name_Map name_map_G10x5y7[] = {
  NSPAIR(_ZN7G10x5y7C1Ev),
  NSPAIR(_ZN7G10x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x5;
extern VTBL_ENTRY _ZTI5E10x5[];
extern  VTBL_ENTRY _ZTV5E10x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E10x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x5y7[];
static  VTBL_ENTRY vtc_G10x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G10x5y7[0]),
};
extern VTBL_ENTRY _ZTV7G10x5y7[];
static  VTBL_ENTRY _tg__ZTV5E10x5__7G10x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x5__7G10x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x5y7[] = {
  {&(_ZTV7G10x5y7[7]),  7,16},
  {&(_ZTV7G10x5y7[12]),  12,16},
  {&(_ZTV7G10x5y7[16]),  16,16},
  {&(_tg__ZTV5E10x5__7G10x5y7[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x5__7G10x5y7[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x5y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x5y7[];
extern  VTBL_ENTRY _ZTV7G10x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x5y7[];
Class_Descriptor cd_G10x5y7 = {  "G10x5y7", // class name
  bases_G10x5y7, 6,
  &(vtc_G10x5y7[0]), // expected_vtbl_contents
  &(vtt_G10x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x5y7),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x5y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E11x5  : virtual C11 , D0 {
  int fd;
  ~E11x5(); // tgen
  E11x5(); // tgen
};
//SIG(-1 E11x5) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} BC5{ Fi} Fi}


E11x5 ::~E11x5(){ note_dtor("E11x5", this);} // tgen
E11x5 ::E11x5(){ note_ctor("E11x5", this);} // tgen

static void Test_E11x5()
{
  extern Class_Descriptor cd_E11x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E11x5, buf);
    E11x5 *dp, &lv = *(dp=new (buf) E11x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E11x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x5)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,20), "E11x5");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,28), "E11x5");
    check_base_class_offset(lv, (C11*), ABISELECT(16,12), "E11x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E11x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E11x5.fd");
    test_class_info(&lv, &cd_E11x5);
    dp->~E11x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x5(Test_E11x5, "E11x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E11x5C1Ev();
extern void _ZN5E11x5D1Ev();
Name_Map name_map_E11x5[] = {
  NSPAIR(_ZN5E11x5C1Ev),
  NSPAIR(_ZN5E11x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E11x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E11x5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E11x5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV5E11x5[];
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__5E11x5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x5[] = {
  {&(_ZTV5E11x5[5]),  5,13},
  {&(_ZTV5E11x5[9]),  9,13},
  {&(_ZTV5E11x5[12]),  12,13},
  {&(_tg__ZTV3C11__5E11x5[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__5E11x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
Class_Descriptor cd_E11x5 = {  "E11x5", // class name
  bases_E11x5, 4,
  &(vtc_E11x5[0]), // expected_vtbl_contents
  &(vtt_E11x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E11x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E11x5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E11x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y0  : E11x5 , F1 {
  int ff;
  ~G11x5y0(); // tgen
  G11x5y0(); // tgen
};
//SIG(1 G11x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x5y0 ::~G11x5y0(){ note_dtor("G11x5y0", this);} // tgen
G11x5y0 ::G11x5y0(){ note_ctor("G11x5y0", this);} // tgen

static void Test_G11x5y0()
{
  extern Class_Descriptor cd_G11x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G11x5y0, buf);
    G11x5y0 *dp, &lv = *(dp=new (buf) G11x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G11x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y0)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,32), "G11x5y0");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,40), "G11x5y0");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(32,24), "G11x5y0");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(8,4), "G11x5y0");
    check_base_class_offset(lv, (E11x5*), 0, "G11x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G11x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G11x5y0.ff");
    test_class_info(&lv, &cd_G11x5y0);
    dp->~G11x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y0(Test_G11x5y0, "G11x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G11x5y0C1Ev();
extern void _ZN7G11x5y0D1Ev();
Name_Map name_map_G11x5y0[] = {
  NSPAIR(_ZN7G11x5y0C1Ev),
  NSPAIR(_ZN7G11x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x5y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x5y0[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G11x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y0[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y0[] = {
  {&(_ZTV7G11x5y0[5]),  5,16},
  {&(_tg__ZTV5E11x5__7G11x5y0[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y0[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y0[3]),  3,4},
  {&(_ZTV7G11x5y0[12]),  12,16},
  {&(_ZTV7G11x5y0[15]),  15,16},
  {&(_tg__ZTV3C11__7G11x5y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y0[];
extern  VTBL_ENTRY _ZTV7G11x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y0[];
Class_Descriptor cd_G11x5y0 = {  "G11x5y0", // class name
  bases_G11x5y0, 6,
  &(vtc_G11x5y0[0]), // expected_vtbl_contents
  &(vtt_G11x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G11x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y0),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y1  : virtual E11x5 , F1 {
  int ff;
  ~G11x5y1(); // tgen
  G11x5y1(); // tgen
};
//SIG(1 G11x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x5y1 ::~G11x5y1(){ note_dtor("G11x5y1", this);} // tgen
G11x5y1 ::G11x5y1(){ note_ctor("G11x5y1", this);} // tgen

static void Test_G11x5y1()
{
  extern Class_Descriptor cd_G11x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G11x5y1, buf);
    G11x5y1 *dp, &lv = *(dp=new (buf) G11x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G11x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y1)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,32), "G11x5y1");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,40), "G11x5y1");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(32,24), "G11x5y1");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(24,16), "G11x5y1");
    check_base_class_offset(lv, (E11x5*), ABISELECT(16,12), "G11x5y1");
    check_base_class_offset(lv, (F1*), 0, "G11x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x5y1.ff");
    test_class_info(&lv, &cd_G11x5y1);
    dp->~G11x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y1(Test_G11x5y1, "G11x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G11x5y1C1Ev();
extern void _ZN7G11x5y1D1Ev();
Name_Map name_map_G11x5y1[] = {
  NSPAIR(_ZN7G11x5y1C1Ev),
  NSPAIR(_ZN7G11x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x5y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x5y1[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x5y1[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G11x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y1[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y1[] = {
  {&(_ZTV7G11x5y1[6]),  6,20},
  {&(_ZTV7G11x5y1[12]),  12,20},
  {&(_ZTV7G11x5y1[16]),  16,20},
  {&(_ZTV7G11x5y1[19]),  19,20},
  {&(_tg__ZTV5E11x5__7G11x5y1[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y1[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y1[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x5y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y1[];
extern  VTBL_ENTRY _ZTV7G11x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y1[];
Class_Descriptor cd_G11x5y1 = {  "G11x5y1", // class name
  bases_G11x5y1, 6,
  &(vtc_G11x5y1[0]), // expected_vtbl_contents
  &(vtt_G11x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G11x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y1),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y2  : E11x5 , virtual F1 {
  int ff;
  ~G11x5y2(); // tgen
  G11x5y2(); // tgen
};
//SIG(1 G11x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x5y2 ::~G11x5y2(){ note_dtor("G11x5y2", this);} // tgen
G11x5y2 ::G11x5y2(){ note_ctor("G11x5y2", this);} // tgen

static void Test_G11x5y2()
{
  extern Class_Descriptor cd_G11x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x5y2, buf);
    G11x5y2 *dp, &lv = *(dp=new (buf) G11x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y2)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,24), "G11x5y2");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,32), "G11x5y2");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(24,16), "G11x5y2");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(8,4), "G11x5y2");
    check_base_class_offset(lv, (E11x5*), 0, "G11x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x5y2.ff");
    test_class_info(&lv, &cd_G11x5y2);
    dp->~G11x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y2(Test_G11x5y2, "G11x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x5y2C1Ev();
extern void _ZN7G11x5y2D1Ev();
Name_Map name_map_G11x5y2[] = {
  NSPAIR(_ZN7G11x5y2C1Ev),
  NSPAIR(_ZN7G11x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y2[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G11x5y2[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G11x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G11x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y2[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y2[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y2[] = {
  {&(_ZTV7G11x5y2[6]),  6,18},
  {&(_tg__ZTV5E11x5__7G11x5y2[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y2[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y2[3]),  3,4},
  {&(_ZTV7G11x5y2[10]),  10,18},
  {&(_ZTV7G11x5y2[13]),  13,18},
  {&(_ZTV7G11x5y2[17]),  17,18},
  {&(_tg__ZTV3C11__7G11x5y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y2[];
extern  VTBL_ENTRY _ZTV7G11x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y2[];
Class_Descriptor cd_G11x5y2 = {  "G11x5y2", // class name
  bases_G11x5y2, 6,
  &(vtc_G11x5y2[0]), // expected_vtbl_contents
  &(vtt_G11x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y2),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y3  : virtual E11x5 , virtual F1 {
  int ff;
  ~G11x5y3(); // tgen
  G11x5y3(); // tgen
};
//SIG(1 G11x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x5y3 ::~G11x5y3(){ note_dtor("G11x5y3", this);} // tgen
G11x5y3 ::G11x5y3(){ note_ctor("G11x5y3", this);} // tgen

static void Test_G11x5y3()
{
  extern Class_Descriptor cd_G11x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G11x5y3, buf);
    G11x5y3 *dp, &lv = *(dp=new (buf) G11x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G11x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y3)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x5y3");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x5y3");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(32,20), "G11x5y3");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(24,12), "G11x5y3");
    check_base_class_offset(lv, (E11x5*), ABISELECT(16,8), "G11x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G11x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x5y3.ff");
    test_class_info(&lv, &cd_G11x5y3);
    dp->~G11x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y3(Test_G11x5y3, "G11x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G11x5y3C1Ev();
extern void _ZN7G11x5y3D1Ev();
Name_Map name_map_G11x5y3[] = {
  NSPAIR(_ZN7G11x5y3C1Ev),
  NSPAIR(_ZN7G11x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x5y3[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x5y3[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G11x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G11x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y3[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y3[] = {
  {&(_ZTV7G11x5y3[7]),  7,24},
  {&(_ZTV7G11x5y3[12]),  12,24},
  {&(_ZTV7G11x5y3[16]),  16,24},
  {&(_ZTV7G11x5y3[19]),  19,24},
  {&(_ZTV7G11x5y3[23]),  23,24},
  {&(_tg__ZTV5E11x5__7G11x5y3[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y3[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y3[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x5y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y3[];
extern  VTBL_ENTRY _ZTV7G11x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y3[];
Class_Descriptor cd_G11x5y3 = {  "G11x5y3", // class name
  bases_G11x5y3, 6,
  &(vtc_G11x5y3[0]), // expected_vtbl_contents
  &(vtt_G11x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G11x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y3),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y4  : E11x5 , F0 {
  int ff;
  ~G11x5y4(); // tgen
  G11x5y4(); // tgen
};
//SIG(1 G11x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G11x5y4 ::~G11x5y4(){ note_dtor("G11x5y4", this);} // tgen
G11x5y4 ::G11x5y4(){ note_ctor("G11x5y4", this);} // tgen

static void Test_G11x5y4()
{
  extern Class_Descriptor cd_G11x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x5y4, buf);
    G11x5y4 *dp, &lv = *(dp=new (buf) G11x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y4)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,28), "G11x5y4");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,36), "G11x5y4");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(24,20), "G11x5y4");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(8,4), "G11x5y4");
    check_base_class_offset(lv, (E11x5*), 0, "G11x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G11x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x5y4.ff");
    test_class_info(&lv, &cd_G11x5y4);
    dp->~G11x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y4(Test_G11x5y4, "G11x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x5y4C1Ev();
extern void _ZN7G11x5y4D1Ev();
Name_Map name_map_G11x5y4[] = {
  NSPAIR(_ZN7G11x5y4C1Ev),
  NSPAIR(_ZN7G11x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x5y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y4[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G11x5y4[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G11x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y4[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y4[] = {
  {&(_ZTV7G11x5y4[5]),  5,13},
  {&(_tg__ZTV5E11x5__7G11x5y4[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y4[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y4[3]),  3,4},
  {&(_ZTV7G11x5y4[9]),  9,13},
  {&(_ZTV7G11x5y4[12]),  12,13},
  {&(_tg__ZTV3C11__7G11x5y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y4[];
extern  VTBL_ENTRY _ZTV7G11x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y4[];
Class_Descriptor cd_G11x5y4 = {  "G11x5y4", // class name
  bases_G11x5y4, 6,
  &(vtc_G11x5y4[0]), // expected_vtbl_contents
  &(vtt_G11x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y4),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y5  : virtual E11x5 , F0 {
  int ff;
  ~G11x5y5(); // tgen
  G11x5y5(); // tgen
};
//SIG(1 G11x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G11x5y5 ::~G11x5y5(){ note_dtor("G11x5y5", this);} // tgen
G11x5y5 ::G11x5y5(){ note_ctor("G11x5y5", this);} // tgen

static void Test_G11x5y5()
{
  extern Class_Descriptor cd_G11x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G11x5y5, buf);
    G11x5y5 *dp, &lv = *(dp=new (buf) G11x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G11x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y5)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,32), "G11x5y5");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,40), "G11x5y5");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(32,24), "G11x5y5");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(24,16), "G11x5y5");
    check_base_class_offset(lv, (E11x5*), ABISELECT(16,12), "G11x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x5y5.ff");
    test_class_info(&lv, &cd_G11x5y5);
    dp->~G11x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y5(Test_G11x5y5, "G11x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G11x5y5C1Ev();
extern void _ZN7G11x5y5D1Ev();
Name_Map name_map_G11x5y5[] = {
  NSPAIR(_ZN7G11x5y5C1Ev),
  NSPAIR(_ZN7G11x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x5y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x5y5[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x5y5[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G11x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y5[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y5[] = {
  {&(_ZTV7G11x5y5[6]),  6,19},
  {&(_ZTV7G11x5y5[11]),  11,19},
  {&(_ZTV7G11x5y5[15]),  15,19},
  {&(_ZTV7G11x5y5[18]),  18,19},
  {&(_tg__ZTV5E11x5__7G11x5y5[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y5[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y5[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x5y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y5[];
extern  VTBL_ENTRY _ZTV7G11x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y5[];
Class_Descriptor cd_G11x5y5 = {  "G11x5y5", // class name
  bases_G11x5y5, 6,
  &(vtc_G11x5y5[0]), // expected_vtbl_contents
  &(vtt_G11x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G11x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y5),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y6  : E11x5 , virtual F0 {
  int ff;
  ~G11x5y6(); // tgen
  G11x5y6(); // tgen
};
//SIG(1 G11x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x5y6 ::~G11x5y6(){ note_dtor("G11x5y6", this);} // tgen
G11x5y6 ::G11x5y6(){ note_ctor("G11x5y6", this);} // tgen

static void Test_G11x5y6()
{
  extern Class_Descriptor cd_G11x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x5y6, buf);
    G11x5y6 *dp, &lv = *(dp=new (buf) G11x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y6)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,24), "G11x5y6");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,32), "G11x5y6");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(24,16), "G11x5y6");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(8,4), "G11x5y6");
    check_base_class_offset(lv, (E11x5*), 0, "G11x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G11x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x5y6.ff");
    test_class_info(&lv, &cd_G11x5y6);
    dp->~G11x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y6(Test_G11x5y6, "G11x5y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G11x5y6C1Ev();
extern void _ZN7G11x5y6D1Ev();
Name_Map name_map_G11x5y6[] = {
  NSPAIR(_ZN7G11x5y6C1Ev),
  NSPAIR(_ZN7G11x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x5y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y6[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G11x5y6[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G11x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y6[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y6[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y6[] = {
  {&(_ZTV7G11x5y6[6]),  6,14},
  {&(_tg__ZTV5E11x5__7G11x5y6[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y6[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y6[3]),  3,4},
  {&(_ZTV7G11x5y6[10]),  10,14},
  {&(_ZTV7G11x5y6[13]),  13,14},
  {&(_tg__ZTV3C11__7G11x5y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y6[];
extern  VTBL_ENTRY _ZTV7G11x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y6[];
Class_Descriptor cd_G11x5y6 = {  "G11x5y6", // class name
  bases_G11x5y6, 6,
  &(vtc_G11x5y6[0]), // expected_vtbl_contents
  &(vtt_G11x5y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G11x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y6),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x5y7  : virtual E11x5 , virtual F0 {
  int ff;
  ~G11x5y7(); // tgen
  G11x5y7(); // tgen
};
//SIG(1 G11x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x5y7 ::~G11x5y7(){ note_dtor("G11x5y7", this);} // tgen
G11x5y7 ::G11x5y7(){ note_ctor("G11x5y7", this);} // tgen

static void Test_G11x5y7()
{
  extern Class_Descriptor cd_G11x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x5y7, buf);
    G11x5y7 *dp, &lv = *(dp=new (buf) G11x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x5y7)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x5y7");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x5y7");
    check_base_class_offset(lv, (C11*)(E11x5*), ABISELECT(32,20), "G11x5y7");
    check_base_class_offset(lv, (D0*)(E11x5*), ABISELECT(24,12), "G11x5y7");
    check_base_class_offset(lv, (E11x5*), ABISELECT(16,8), "G11x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G11x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x5y7.ff");
    test_class_info(&lv, &cd_G11x5y7);
    dp->~G11x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x5y7(Test_G11x5y7, "G11x5y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x5y7C1Ev();
extern void _ZN7G11x5y7D1Ev();
Name_Map name_map_G11x5y7[] = {
  NSPAIR(_ZN7G11x5y7C1Ev),
  NSPAIR(_ZN7G11x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x5;
extern VTBL_ENTRY _ZTI5E11x5[];
extern  VTBL_ENTRY _ZTV5E11x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E11x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x5y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x5y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x5y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x5y7[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x5y7[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G11x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x5y7[];
static  VTBL_ENTRY _tg__ZTV5E11x5__7G11x5y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x5__7G11x5y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x5__7G11x5y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x5y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x5y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x5y7[] = {
  {&(_ZTV7G11x5y7[7]),  7,20},
  {&(_ZTV7G11x5y7[12]),  12,20},
  {&(_ZTV7G11x5y7[16]),  16,20},
  {&(_ZTV7G11x5y7[19]),  19,20},
  {&(_tg__ZTV5E11x5__7G11x5y7[5]),  5,5},
  {&(_tg__ZTV3C11__5E11x5__7G11x5y7[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x5__7G11x5y7[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x5y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x5y7[];
extern  VTBL_ENTRY _ZTV7G11x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x5y7[];
Class_Descriptor cd_G11x5y7 = {  "G11x5y7", // class name
  bases_G11x5y7, 6,
  &(vtc_G11x5y7[0]), // expected_vtbl_contents
  &(vtt_G11x5y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x5y7),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E12x5  : virtual C12 , D0 {
  int fd;
  ~E12x5(); // tgen
  E12x5(); // tgen
};
//SIG(-1 E12x5) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E12x5 ::~E12x5(){ note_dtor("E12x5", this);} // tgen
E12x5 ::E12x5(){ note_ctor("E12x5", this);} // tgen

static void Test_E12x5()
{
  extern Class_Descriptor cd_E12x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E12x5, buf);
    E12x5 *dp, &lv = *(dp=new (buf) E12x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E12x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x5)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,16), "E12x5");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,24), "E12x5");
    check_base_class_offset(lv, (C12*), ABISELECT(16,12), "E12x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E12x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E12x5.fd");
    test_class_info(&lv, &cd_E12x5);
    dp->~E12x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x5(Test_E12x5, "E12x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E12x5C1Ev();
extern void _ZN5E12x5D1Ev();
Name_Map name_map_E12x5[] = {
  NSPAIR(_ZN5E12x5C1Ev),
  NSPAIR(_ZN5E12x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E12x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E12x5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E12x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E12x5[];
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__5E12x5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x5[] = {
  {&(_ZTV5E12x5[4]),  4,11},
  {&(_ZTV5E12x5[7]),  7,11},
  {&(_ZTV5E12x5[10]),  10,11},
  {&(_tg__ZTV3C12__5E12x5[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__5E12x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
Class_Descriptor cd_E12x5 = {  "E12x5", // class name
  bases_E12x5, 4,
  &(vtc_E12x5[0]), // expected_vtbl_contents
  &(vtt_E12x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E12x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E12x5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E12x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y0  : E12x5 , F1 {
  int ff;
  ~G12x5y0(); // tgen
  G12x5y0(); // tgen
};
//SIG(1 G12x5y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x5y0 ::~G12x5y0(){ note_dtor("G12x5y0", this);} // tgen
G12x5y0 ::G12x5y0(){ note_ctor("G12x5y0", this);} // tgen

static void Test_G12x5y0()
{
  extern Class_Descriptor cd_G12x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x5y0, buf);
    G12x5y0 *dp, &lv = *(dp=new (buf) G12x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y0)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,28), "G12x5y0");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,36), "G12x5y0");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(32,24), "G12x5y0");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(8,4), "G12x5y0");
    check_base_class_offset(lv, (E12x5*), 0, "G12x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G12x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G12x5y0.ff");
    test_class_info(&lv, &cd_G12x5y0);
    dp->~G12x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y0(Test_G12x5y0, "G12x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x5y0C1Ev();
extern void _ZN7G12x5y0D1Ev();
Name_Map name_map_G12x5y0[] = {
  NSPAIR(_ZN7G12x5y0C1Ev),
  NSPAIR(_ZN7G12x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x5y0[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G12x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y0[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y0[] = {
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y0[] = {
  {&(_ZTV7G12x5y0[4]),  4,14},
  {&(_tg__ZTV5E12x5__7G12x5y0[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y0[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y0[3]),  3,4},
  {&(_ZTV7G12x5y0[10]),  10,14},
  {&(_ZTV7G12x5y0[13]),  13,14},
  {&(_tg__ZTV3C12__7G12x5y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y0[];
extern  VTBL_ENTRY _ZTV7G12x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y0[];
Class_Descriptor cd_G12x5y0 = {  "G12x5y0", // class name
  bases_G12x5y0, 6,
  &(vtc_G12x5y0[0]), // expected_vtbl_contents
  &(vtt_G12x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y0),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y1  : virtual E12x5 , F1 {
  int ff;
  ~G12x5y1(); // tgen
  G12x5y1(); // tgen
};
//SIG(1 G12x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x5y1 ::~G12x5y1(){ note_dtor("G12x5y1", this);} // tgen
G12x5y1 ::G12x5y1(){ note_ctor("G12x5y1", this);} // tgen

static void Test_G12x5y1()
{
  extern Class_Descriptor cd_G12x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x5y1, buf);
    G12x5y1 *dp, &lv = *(dp=new (buf) G12x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y1)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,28), "G12x5y1");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,36), "G12x5y1");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(32,24), "G12x5y1");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(24,16), "G12x5y1");
    check_base_class_offset(lv, (E12x5*), ABISELECT(16,12), "G12x5y1");
    check_base_class_offset(lv, (F1*), 0, "G12x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x5y1.ff");
    test_class_info(&lv, &cd_G12x5y1);
    dp->~G12x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y1(Test_G12x5y1, "G12x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x5y1C1Ev();
extern void _ZN7G12x5y1D1Ev();
Name_Map name_map_G12x5y1[] = {
  NSPAIR(_ZN7G12x5y1C1Ev),
  NSPAIR(_ZN7G12x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x5y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x5y1[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G12x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y1[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y1[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y1[] = {
  {&(_ZTV7G12x5y1[5]),  5,17},
  {&(_ZTV7G12x5y1[10]),  10,17},
  {&(_ZTV7G12x5y1[13]),  13,17},
  {&(_ZTV7G12x5y1[16]),  16,17},
  {&(_tg__ZTV5E12x5__7G12x5y1[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y1[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y1[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x5y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y1[];
extern  VTBL_ENTRY _ZTV7G12x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y1[];
Class_Descriptor cd_G12x5y1 = {  "G12x5y1", // class name
  bases_G12x5y1, 6,
  &(vtc_G12x5y1[0]), // expected_vtbl_contents
  &(vtt_G12x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y2  : E12x5 , virtual F1 {
  int ff;
  ~G12x5y2(); // tgen
  G12x5y2(); // tgen
};
//SIG(1 G12x5y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x5y2 ::~G12x5y2(){ note_dtor("G12x5y2", this);} // tgen
G12x5y2 ::G12x5y2(){ note_ctor("G12x5y2", this);} // tgen

static void Test_G12x5y2()
{
  extern Class_Descriptor cd_G12x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x5y2, buf);
    G12x5y2 *dp, &lv = *(dp=new (buf) G12x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y2)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,20), "G12x5y2");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,28), "G12x5y2");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(24,16), "G12x5y2");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(8,4), "G12x5y2");
    check_base_class_offset(lv, (E12x5*), 0, "G12x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G12x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G12x5y2.ff");
    test_class_info(&lv, &cd_G12x5y2);
    dp->~G12x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y2(Test_G12x5y2, "G12x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G12x5y2C1Ev();
extern void _ZN7G12x5y2D1Ev();
Name_Map name_map_G12x5y2[] = {
  NSPAIR(_ZN7G12x5y2C1Ev),
  NSPAIR(_ZN7G12x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y2[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G12x5y2[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G12x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y2[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y2[] = {
  {&(_ZTV7G12x5y2[5]),  5,16},
  {&(_tg__ZTV5E12x5__7G12x5y2[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y2[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y2[3]),  3,4},
  {&(_ZTV7G12x5y2[8]),  8,16},
  {&(_ZTV7G12x5y2[11]),  11,16},
  {&(_ZTV7G12x5y2[15]),  15,16},
  {&(_tg__ZTV3C12__7G12x5y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y2[];
extern  VTBL_ENTRY _ZTV7G12x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y2[];
Class_Descriptor cd_G12x5y2 = {  "G12x5y2", // class name
  bases_G12x5y2, 6,
  &(vtc_G12x5y2[0]), // expected_vtbl_contents
  &(vtt_G12x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G12x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y2),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y3  : virtual E12x5 , virtual F1 {
  int ff;
  ~G12x5y3(); // tgen
  G12x5y3(); // tgen
};
//SIG(1 G12x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x5y3 ::~G12x5y3(){ note_dtor("G12x5y3", this);} // tgen
G12x5y3 ::G12x5y3(){ note_ctor("G12x5y3", this);} // tgen

static void Test_G12x5y3()
{
  extern Class_Descriptor cd_G12x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G12x5y3, buf);
    G12x5y3 *dp, &lv = *(dp=new (buf) G12x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G12x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y3)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x5y3");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x5y3");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(32,20), "G12x5y3");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(24,12), "G12x5y3");
    check_base_class_offset(lv, (E12x5*), ABISELECT(16,8), "G12x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G12x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x5y3.ff");
    test_class_info(&lv, &cd_G12x5y3);
    dp->~G12x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y3(Test_G12x5y3, "G12x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G12x5y3C1Ev();
extern void _ZN7G12x5y3D1Ev();
Name_Map name_map_G12x5y3[] = {
  NSPAIR(_ZN7G12x5y3C1Ev),
  NSPAIR(_ZN7G12x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G12x5y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G12x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G12x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y3[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y3[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y3[] = {
  {&(_ZTV7G12x5y3[6]),  6,21},
  {&(_ZTV7G12x5y3[10]),  10,21},
  {&(_ZTV7G12x5y3[13]),  13,21},
  {&(_ZTV7G12x5y3[16]),  16,21},
  {&(_ZTV7G12x5y3[20]),  20,21},
  {&(_tg__ZTV5E12x5__7G12x5y3[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y3[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y3[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x5y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y3[];
extern  VTBL_ENTRY _ZTV7G12x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y3[];
Class_Descriptor cd_G12x5y3 = {  "G12x5y3", // class name
  bases_G12x5y3, 6,
  &(vtc_G12x5y3[0]), // expected_vtbl_contents
  &(vtt_G12x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G12x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y4  : E12x5 , F0 {
  int ff;
  ~G12x5y4(); // tgen
  G12x5y4(); // tgen
};
//SIG(1 G12x5y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G12x5y4 ::~G12x5y4(){ note_dtor("G12x5y4", this);} // tgen
G12x5y4 ::G12x5y4(){ note_ctor("G12x5y4", this);} // tgen

static void Test_G12x5y4()
{
  extern Class_Descriptor cd_G12x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x5y4, buf);
    G12x5y4 *dp, &lv = *(dp=new (buf) G12x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y4)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,24), "G12x5y4");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,32), "G12x5y4");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(24,20), "G12x5y4");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(8,4), "G12x5y4");
    check_base_class_offset(lv, (E12x5*), 0, "G12x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G12x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G12x5y4.ff");
    test_class_info(&lv, &cd_G12x5y4);
    dp->~G12x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y4(Test_G12x5y4, "G12x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x5y4C1Ev();
extern void _ZN7G12x5y4D1Ev();
Name_Map name_map_G12x5y4[] = {
  NSPAIR(_ZN7G12x5y4C1Ev),
  NSPAIR(_ZN7G12x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G12x5y4[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G12x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y4[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y4[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y4[] = {
  {&(_ZTV7G12x5y4[4]),  4,11},
  {&(_tg__ZTV5E12x5__7G12x5y4[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y4[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y4[3]),  3,4},
  {&(_ZTV7G12x5y4[7]),  7,11},
  {&(_ZTV7G12x5y4[10]),  10,11},
  {&(_tg__ZTV3C12__7G12x5y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y4[];
extern  VTBL_ENTRY _ZTV7G12x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y4[];
Class_Descriptor cd_G12x5y4 = {  "G12x5y4", // class name
  bases_G12x5y4, 6,
  &(vtc_G12x5y4[0]), // expected_vtbl_contents
  &(vtt_G12x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y4),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y5  : virtual E12x5 , F0 {
  int ff;
  ~G12x5y5(); // tgen
  G12x5y5(); // tgen
};
//SIG(1 G12x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G12x5y5 ::~G12x5y5(){ note_dtor("G12x5y5", this);} // tgen
G12x5y5 ::G12x5y5(){ note_ctor("G12x5y5", this);} // tgen

static void Test_G12x5y5()
{
  extern Class_Descriptor cd_G12x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x5y5, buf);
    G12x5y5 *dp, &lv = *(dp=new (buf) G12x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y5)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,28), "G12x5y5");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,36), "G12x5y5");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(32,24), "G12x5y5");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(24,16), "G12x5y5");
    check_base_class_offset(lv, (E12x5*), ABISELECT(16,12), "G12x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x5y5.ff");
    test_class_info(&lv, &cd_G12x5y5);
    dp->~G12x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y5(Test_G12x5y5, "G12x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x5y5C1Ev();
extern void _ZN7G12x5y5D1Ev();
Name_Map name_map_G12x5y5[] = {
  NSPAIR(_ZN7G12x5y5C1Ev),
  NSPAIR(_ZN7G12x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x5y5[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G12x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y5[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y5[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y5[] = {
  {&(_ZTV7G12x5y5[5]),  5,16},
  {&(_ZTV7G12x5y5[9]),  9,16},
  {&(_ZTV7G12x5y5[12]),  12,16},
  {&(_ZTV7G12x5y5[15]),  15,16},
  {&(_tg__ZTV5E12x5__7G12x5y5[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y5[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y5[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x5y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y5[];
extern  VTBL_ENTRY _ZTV7G12x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y5[];
Class_Descriptor cd_G12x5y5 = {  "G12x5y5", // class name
  bases_G12x5y5, 6,
  &(vtc_G12x5y5[0]), // expected_vtbl_contents
  &(vtt_G12x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y6  : E12x5 , virtual F0 {
  int ff;
  ~G12x5y6(); // tgen
  G12x5y6(); // tgen
};
//SIG(1 G12x5y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x5y6 ::~G12x5y6(){ note_dtor("G12x5y6", this);} // tgen
G12x5y6 ::G12x5y6(){ note_ctor("G12x5y6", this);} // tgen

static void Test_G12x5y6()
{
  extern Class_Descriptor cd_G12x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x5y6, buf);
    G12x5y6 *dp, &lv = *(dp=new (buf) G12x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y6)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,20), "G12x5y6");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,28), "G12x5y6");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(24,16), "G12x5y6");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(8,4), "G12x5y6");
    check_base_class_offset(lv, (E12x5*), 0, "G12x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G12x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G12x5y6.ff");
    test_class_info(&lv, &cd_G12x5y6);
    dp->~G12x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y6(Test_G12x5y6, "G12x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x5y6C1Ev();
extern void _ZN7G12x5y6D1Ev();
Name_Map name_map_G12x5y6[] = {
  NSPAIR(_ZN7G12x5y6C1Ev),
  NSPAIR(_ZN7G12x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y6[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G12x5y6[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y6[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y6[] = {
  {&(_ZTV7G12x5y6[5]),  5,12},
  {&(_tg__ZTV5E12x5__7G12x5y6[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y6[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y6[3]),  3,4},
  {&(_ZTV7G12x5y6[8]),  8,12},
  {&(_ZTV7G12x5y6[11]),  11,12},
  {&(_tg__ZTV3C12__7G12x5y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y6[];
extern  VTBL_ENTRY _ZTV7G12x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y6[];
Class_Descriptor cd_G12x5y6 = {  "G12x5y6", // class name
  bases_G12x5y6, 6,
  &(vtc_G12x5y6[0]), // expected_vtbl_contents
  &(vtt_G12x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y6),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x5y7  : virtual E12x5 , virtual F0 {
  int ff;
  ~G12x5y7(); // tgen
  G12x5y7(); // tgen
};
//SIG(1 G12x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x5y7 ::~G12x5y7(){ note_dtor("G12x5y7", this);} // tgen
G12x5y7 ::G12x5y7(){ note_ctor("G12x5y7", this);} // tgen

static void Test_G12x5y7()
{
  extern Class_Descriptor cd_G12x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x5y7, buf);
    G12x5y7 *dp, &lv = *(dp=new (buf) G12x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x5y7)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x5y7");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x5y7");
    check_base_class_offset(lv, (C12*)(E12x5*), ABISELECT(32,20), "G12x5y7");
    check_base_class_offset(lv, (D0*)(E12x5*), ABISELECT(24,12), "G12x5y7");
    check_base_class_offset(lv, (E12x5*), ABISELECT(16,8), "G12x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G12x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x5y7.ff");
    test_class_info(&lv, &cd_G12x5y7);
    dp->~G12x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x5y7(Test_G12x5y7, "G12x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x5y7C1Ev();
extern void _ZN7G12x5y7D1Ev();
Name_Map name_map_G12x5y7[] = {
  NSPAIR(_ZN7G12x5y7C1Ev),
  NSPAIR(_ZN7G12x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x5;
extern VTBL_ENTRY _ZTI5E12x5[];
extern  VTBL_ENTRY _ZTV5E12x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E12x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x5y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G12x5y7[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G12x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x5y7[];
static  VTBL_ENTRY _tg__ZTV5E12x5__7G12x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x5__7G12x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x5__7G12x5y7[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x5y7[] = {
  {&(_ZTV7G12x5y7[6]),  6,17},
  {&(_ZTV7G12x5y7[10]),  10,17},
  {&(_ZTV7G12x5y7[13]),  13,17},
  {&(_ZTV7G12x5y7[16]),  16,17},
  {&(_tg__ZTV5E12x5__7G12x5y7[4]),  4,4},
  {&(_tg__ZTV3C12__5E12x5__7G12x5y7[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x5__7G12x5y7[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x5y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x5y7[];
extern  VTBL_ENTRY _ZTV7G12x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x5y7[];
Class_Descriptor cd_G12x5y7 = {  "G12x5y7", // class name
  bases_G12x5y7, 6,
  &(vtc_G12x5y7[0]), // expected_vtbl_contents
  &(vtt_G12x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x5y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x5  : virtual C13 , D0 {
  int fd;
  ~E13x5(); // tgen
  E13x5(); // tgen
};
//SIG(-1 E13x5) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E13x5 ::~E13x5(){ note_dtor("E13x5", this);} // tgen
E13x5 ::E13x5(){ note_ctor("E13x5", this);} // tgen

static void Test_E13x5()
{
  extern Class_Descriptor cd_E13x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E13x5, buf);
    E13x5 *dp, &lv = *(dp=new (buf) E13x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E13x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x5)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,12), "E13x5");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,24), "E13x5");
    check_base_class_offset(lv, (C13*), ABISELECT(16,12), "E13x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E13x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E13x5.fd");
    test_class_info(&lv, &cd_E13x5);
    dp->~E13x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x5(Test_E13x5, "E13x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E13x5C1Ev();
extern void _ZN5E13x5D1Ev();
Name_Map name_map_E13x5[] = {
  NSPAIR(_ZN5E13x5C1Ev),
  NSPAIR(_ZN5E13x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E13x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E13x5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E13x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E13x5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__5E13x5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x5[] = {
  {&(_ZTV5E13x5[4]),  4,13},
  {&(_ZTV5E13x5[8]),  8,13},
  {&(_ZTV5E13x5[12]),  12,13},
  {&(_tg__ZTV3C13__5E13x5[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__5E13x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
Class_Descriptor cd_E13x5 = {  "E13x5", // class name
  bases_E13x5, 4,
  &(vtc_E13x5[0]), // expected_vtbl_contents
  &(vtt_E13x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E13x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E13x5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E13x5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y0  : E13x5 , F1 {
  int ff;
  ~G13x5y0(); // tgen
  G13x5y0(); // tgen
};
//SIG(1 G13x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x5y0 ::~G13x5y0(){ note_dtor("G13x5y0", this);} // tgen
G13x5y0 ::G13x5y0(){ note_ctor("G13x5y0", this);} // tgen

static void Test_G13x5y0()
{
  extern Class_Descriptor cd_G13x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x5y0, buf);
    G13x5y0 *dp, &lv = *(dp=new (buf) G13x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y0)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,24), "G13x5y0");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,36), "G13x5y0");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(32,24), "G13x5y0");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(8,4), "G13x5y0");
    check_base_class_offset(lv, (E13x5*), 0, "G13x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G13x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G13x5y0.ff");
    test_class_info(&lv, &cd_G13x5y0);
    dp->~G13x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y0(Test_G13x5y0, "G13x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x5y0C1Ev();
extern void _ZN7G13x5y0D1Ev();
Name_Map name_map_G13x5y0[] = {
  NSPAIR(_ZN7G13x5y0C1Ev),
  NSPAIR(_ZN7G13x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G13x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y0[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y0[] = {
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y0[] = {
  {&(_ZTV7G13x5y0[4]),  4,16},
  {&(_tg__ZTV5E13x5__7G13x5y0[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y0[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y0[3]),  3,4},
  {&(_ZTV7G13x5y0[11]),  11,16},
  {&(_ZTV7G13x5y0[15]),  15,16},
  {&(_tg__ZTV3C13__7G13x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y0[];
extern  VTBL_ENTRY _ZTV7G13x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y0[];
Class_Descriptor cd_G13x5y0 = {  "G13x5y0", // class name
  bases_G13x5y0, 6,
  &(vtc_G13x5y0[0]), // expected_vtbl_contents
  &(vtt_G13x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y1  : virtual E13x5 , F1 {
  int ff;
  ~G13x5y1(); // tgen
  G13x5y1(); // tgen
};
//SIG(1 G13x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x5y1 ::~G13x5y1(){ note_dtor("G13x5y1", this);} // tgen
G13x5y1 ::G13x5y1(){ note_ctor("G13x5y1", this);} // tgen

static void Test_G13x5y1()
{
  extern Class_Descriptor cd_G13x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x5y1, buf);
    G13x5y1 *dp, &lv = *(dp=new (buf) G13x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y1)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,24), "G13x5y1");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,36), "G13x5y1");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(32,24), "G13x5y1");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(24,16), "G13x5y1");
    check_base_class_offset(lv, (E13x5*), ABISELECT(16,12), "G13x5y1");
    check_base_class_offset(lv, (F1*), 0, "G13x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x5y1.ff");
    test_class_info(&lv, &cd_G13x5y1);
    dp->~G13x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y1(Test_G13x5y1, "G13x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x5y1C1Ev();
extern void _ZN7G13x5y1D1Ev();
Name_Map name_map_G13x5y1[] = {
  NSPAIR(_ZN7G13x5y1C1Ev),
  NSPAIR(_ZN7G13x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G13x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y1[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y1[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y1[] = {
  {&(_ZTV7G13x5y1[5]),  5,19},
  {&(_ZTV7G13x5y1[10]),  10,19},
  {&(_ZTV7G13x5y1[14]),  14,19},
  {&(_ZTV7G13x5y1[18]),  18,19},
  {&(_tg__ZTV5E13x5__7G13x5y1[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y1[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y1[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y1[];
extern  VTBL_ENTRY _ZTV7G13x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y1[];
Class_Descriptor cd_G13x5y1 = {  "G13x5y1", // class name
  bases_G13x5y1, 6,
  &(vtc_G13x5y1[0]), // expected_vtbl_contents
  &(vtt_G13x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y2  : E13x5 , virtual F1 {
  int ff;
  ~G13x5y2(); // tgen
  G13x5y2(); // tgen
};
//SIG(1 G13x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x5y2 ::~G13x5y2(){ note_dtor("G13x5y2", this);} // tgen
G13x5y2 ::G13x5y2(){ note_ctor("G13x5y2", this);} // tgen

static void Test_G13x5y2()
{
  extern Class_Descriptor cd_G13x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x5y2, buf);
    G13x5y2 *dp, &lv = *(dp=new (buf) G13x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y2)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,16), "G13x5y2");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,28), "G13x5y2");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(24,16), "G13x5y2");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(8,4), "G13x5y2");
    check_base_class_offset(lv, (E13x5*), 0, "G13x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G13x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G13x5y2.ff");
    test_class_info(&lv, &cd_G13x5y2);
    dp->~G13x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y2(Test_G13x5y2, "G13x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G13x5y2C1Ev();
extern void _ZN7G13x5y2D1Ev();
Name_Map name_map_G13x5y2[] = {
  NSPAIR(_ZN7G13x5y2C1Ev),
  NSPAIR(_ZN7G13x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G13x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G13x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y2[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y2[] = {
  {&(_ZTV7G13x5y2[5]),  5,18},
  {&(_tg__ZTV5E13x5__7G13x5y2[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y2[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y2[3]),  3,4},
  {&(_ZTV7G13x5y2[9]),  9,18},
  {&(_ZTV7G13x5y2[13]),  13,18},
  {&(_ZTV7G13x5y2[17]),  17,18},
  {&(_tg__ZTV3C13__7G13x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y2[];
extern  VTBL_ENTRY _ZTV7G13x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y2[];
Class_Descriptor cd_G13x5y2 = {  "G13x5y2", // class name
  bases_G13x5y2, 6,
  &(vtc_G13x5y2[0]), // expected_vtbl_contents
  &(vtt_G13x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G13x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y3  : virtual E13x5 , virtual F1 {
  int ff;
  ~G13x5y3(); // tgen
  G13x5y3(); // tgen
};
//SIG(1 G13x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x5y3 ::~G13x5y3(){ note_dtor("G13x5y3", this);} // tgen
G13x5y3 ::G13x5y3(){ note_ctor("G13x5y3", this);} // tgen

static void Test_G13x5y3()
{
  extern Class_Descriptor cd_G13x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G13x5y3, buf);
    G13x5y3 *dp, &lv = *(dp=new (buf) G13x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G13x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y3)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x5y3");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x5y3");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(32,20), "G13x5y3");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(24,12), "G13x5y3");
    check_base_class_offset(lv, (E13x5*), ABISELECT(16,8), "G13x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G13x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x5y3.ff");
    test_class_info(&lv, &cd_G13x5y3);
    dp->~G13x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y3(Test_G13x5y3, "G13x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G13x5y3C1Ev();
extern void _ZN7G13x5y3D1Ev();
Name_Map name_map_G13x5y3[] = {
  NSPAIR(_ZN7G13x5y3C1Ev),
  NSPAIR(_ZN7G13x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G13x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G13x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G13x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y3[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y3[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y3[] = {
  {&(_ZTV7G13x5y3[6]),  6,23},
  {&(_ZTV7G13x5y3[10]),  10,23},
  {&(_ZTV7G13x5y3[14]),  14,23},
  {&(_ZTV7G13x5y3[18]),  18,23},
  {&(_ZTV7G13x5y3[22]),  22,23},
  {&(_tg__ZTV5E13x5__7G13x5y3[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y3[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y3[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y3[];
extern  VTBL_ENTRY _ZTV7G13x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y3[];
Class_Descriptor cd_G13x5y3 = {  "G13x5y3", // class name
  bases_G13x5y3, 6,
  &(vtc_G13x5y3[0]), // expected_vtbl_contents
  &(vtt_G13x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G13x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y4  : E13x5 , F0 {
  int ff;
  ~G13x5y4(); // tgen
  G13x5y4(); // tgen
};
//SIG(1 G13x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G13x5y4 ::~G13x5y4(){ note_dtor("G13x5y4", this);} // tgen
G13x5y4 ::G13x5y4(){ note_ctor("G13x5y4", this);} // tgen

static void Test_G13x5y4()
{
  extern Class_Descriptor cd_G13x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x5y4, buf);
    G13x5y4 *dp, &lv = *(dp=new (buf) G13x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y4)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,20), "G13x5y4");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,32), "G13x5y4");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(24,20), "G13x5y4");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(8,4), "G13x5y4");
    check_base_class_offset(lv, (E13x5*), 0, "G13x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G13x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G13x5y4.ff");
    test_class_info(&lv, &cd_G13x5y4);
    dp->~G13x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y4(Test_G13x5y4, "G13x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x5y4C1Ev();
extern void _ZN7G13x5y4D1Ev();
Name_Map name_map_G13x5y4[] = {
  NSPAIR(_ZN7G13x5y4C1Ev),
  NSPAIR(_ZN7G13x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G13x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G13x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y4[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y4[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y4[] = {
  {&(_ZTV7G13x5y4[4]),  4,13},
  {&(_tg__ZTV5E13x5__7G13x5y4[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y4[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y4[3]),  3,4},
  {&(_ZTV7G13x5y4[8]),  8,13},
  {&(_ZTV7G13x5y4[12]),  12,13},
  {&(_tg__ZTV3C13__7G13x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y4[];
extern  VTBL_ENTRY _ZTV7G13x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y4[];
Class_Descriptor cd_G13x5y4 = {  "G13x5y4", // class name
  bases_G13x5y4, 6,
  &(vtc_G13x5y4[0]), // expected_vtbl_contents
  &(vtt_G13x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y5  : virtual E13x5 , F0 {
  int ff;
  ~G13x5y5(); // tgen
  G13x5y5(); // tgen
};
//SIG(1 G13x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G13x5y5 ::~G13x5y5(){ note_dtor("G13x5y5", this);} // tgen
G13x5y5 ::G13x5y5(){ note_ctor("G13x5y5", this);} // tgen

static void Test_G13x5y5()
{
  extern Class_Descriptor cd_G13x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x5y5, buf);
    G13x5y5 *dp, &lv = *(dp=new (buf) G13x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y5)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,24), "G13x5y5");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,36), "G13x5y5");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(32,24), "G13x5y5");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(24,16), "G13x5y5");
    check_base_class_offset(lv, (E13x5*), ABISELECT(16,12), "G13x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x5y5.ff");
    test_class_info(&lv, &cd_G13x5y5);
    dp->~G13x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y5(Test_G13x5y5, "G13x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x5y5C1Ev();
extern void _ZN7G13x5y5D1Ev();
Name_Map name_map_G13x5y5[] = {
  NSPAIR(_ZN7G13x5y5C1Ev),
  NSPAIR(_ZN7G13x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G13x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y5[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y5[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y5[] = {
  {&(_ZTV7G13x5y5[5]),  5,18},
  {&(_ZTV7G13x5y5[9]),  9,18},
  {&(_ZTV7G13x5y5[13]),  13,18},
  {&(_ZTV7G13x5y5[17]),  17,18},
  {&(_tg__ZTV5E13x5__7G13x5y5[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y5[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y5[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y5[];
extern  VTBL_ENTRY _ZTV7G13x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y5[];
Class_Descriptor cd_G13x5y5 = {  "G13x5y5", // class name
  bases_G13x5y5, 6,
  &(vtc_G13x5y5[0]), // expected_vtbl_contents
  &(vtt_G13x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y6  : E13x5 , virtual F0 {
  int ff;
  ~G13x5y6(); // tgen
  G13x5y6(); // tgen
};
//SIG(1 G13x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x5y6 ::~G13x5y6(){ note_dtor("G13x5y6", this);} // tgen
G13x5y6 ::G13x5y6(){ note_ctor("G13x5y6", this);} // tgen

static void Test_G13x5y6()
{
  extern Class_Descriptor cd_G13x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x5y6, buf);
    G13x5y6 *dp, &lv = *(dp=new (buf) G13x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y6)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,16), "G13x5y6");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,28), "G13x5y6");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(24,16), "G13x5y6");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(8,4), "G13x5y6");
    check_base_class_offset(lv, (E13x5*), 0, "G13x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G13x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G13x5y6.ff");
    test_class_info(&lv, &cd_G13x5y6);
    dp->~G13x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y6(Test_G13x5y6, "G13x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x5y6C1Ev();
extern void _ZN7G13x5y6D1Ev();
Name_Map name_map_G13x5y6[] = {
  NSPAIR(_ZN7G13x5y6C1Ev),
  NSPAIR(_ZN7G13x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G13x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y6[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y6[] = {
  {&(_ZTV7G13x5y6[5]),  5,14},
  {&(_tg__ZTV5E13x5__7G13x5y6[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y6[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y6[3]),  3,4},
  {&(_ZTV7G13x5y6[9]),  9,14},
  {&(_ZTV7G13x5y6[13]),  13,14},
  {&(_tg__ZTV3C13__7G13x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y6[];
extern  VTBL_ENTRY _ZTV7G13x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y6[];
Class_Descriptor cd_G13x5y6 = {  "G13x5y6", // class name
  bases_G13x5y6, 6,
  &(vtc_G13x5y6[0]), // expected_vtbl_contents
  &(vtt_G13x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x5y7  : virtual E13x5 , virtual F0 {
  int ff;
  ~G13x5y7(); // tgen
  G13x5y7(); // tgen
};
//SIG(1 G13x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x5y7 ::~G13x5y7(){ note_dtor("G13x5y7", this);} // tgen
G13x5y7 ::G13x5y7(){ note_ctor("G13x5y7", this);} // tgen

static void Test_G13x5y7()
{
  extern Class_Descriptor cd_G13x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x5y7, buf);
    G13x5y7 *dp, &lv = *(dp=new (buf) G13x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x5y7)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x5y7");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x5y7");
    check_base_class_offset(lv, (C13*)(E13x5*), ABISELECT(32,20), "G13x5y7");
    check_base_class_offset(lv, (D0*)(E13x5*), ABISELECT(24,12), "G13x5y7");
    check_base_class_offset(lv, (E13x5*), ABISELECT(16,8), "G13x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G13x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x5y7.ff");
    test_class_info(&lv, &cd_G13x5y7);
    dp->~G13x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x5y7(Test_G13x5y7, "G13x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x5y7C1Ev();
extern void _ZN7G13x5y7D1Ev();
Name_Map name_map_G13x5y7[] = {
  NSPAIR(_ZN7G13x5y7C1Ev),
  NSPAIR(_ZN7G13x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x5;
extern VTBL_ENTRY _ZTI5E13x5[];
extern  VTBL_ENTRY _ZTV5E13x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E13x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x5y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G13x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G13x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x5y7[];
static  VTBL_ENTRY _tg__ZTV5E13x5__7G13x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x5__7G13x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x5__7G13x5y7[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x5y7[] = {
  {&(_ZTV7G13x5y7[6]),  6,19},
  {&(_ZTV7G13x5y7[10]),  10,19},
  {&(_ZTV7G13x5y7[14]),  14,19},
  {&(_ZTV7G13x5y7[18]),  18,19},
  {&(_tg__ZTV5E13x5__7G13x5y7[4]),  4,4},
  {&(_tg__ZTV3C13__5E13x5__7G13x5y7[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x5__7G13x5y7[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x5y7[];
extern  VTBL_ENTRY _ZTV7G13x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x5y7[];
Class_Descriptor cd_G13x5y7 = {  "G13x5y7", // class name
  bases_G13x5y7, 6,
  &(vtc_G13x5y7[0]), // expected_vtbl_contents
  &(vtt_G13x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x5y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x5y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x5  : virtual C14 , D0 {
  int fd;
  ~E14x5(); // tgen
  E14x5(); // tgen
};
//SIG(-1 E14x5) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} BC5{ Fi} Fi}


E14x5 ::~E14x5(){ note_dtor("E14x5", this);} // tgen
E14x5 ::E14x5(){ note_ctor("E14x5", this);} // tgen

static void Test_E14x5()
{
  extern Class_Descriptor cd_E14x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E14x5, buf);
    E14x5 *dp, &lv = *(dp=new (buf) E14x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E14x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x5)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,20), "E14x5");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,24), "E14x5");
    check_base_class_offset(lv, (C14*), ABISELECT(16,12), "E14x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E14x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E14x5.fd");
    test_class_info(&lv, &cd_E14x5);
    dp->~E14x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x5(Test_E14x5, "E14x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E14x5C1Ev();
extern void _ZN5E14x5D1Ev();
Name_Map name_map_E14x5[] = {
  NSPAIR(_ZN5E14x5C1Ev),
  NSPAIR(_ZN5E14x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E14x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E14x5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E14x5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E14x5[];
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__5E14x5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x5[] = {
  {&(_ZTV5E14x5[5]),  5,13},
  {&(_ZTV5E14x5[9]),  9,13},
  {&(_ZTV5E14x5[12]),  12,13},
  {&(_tg__ZTV3C14__5E14x5[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__5E14x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
Class_Descriptor cd_E14x5 = {  "E14x5", // class name
  bases_E14x5, 4,
  &(vtc_E14x5[0]), // expected_vtbl_contents
  &(vtt_E14x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E14x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E14x5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E14x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y0  : E14x5 , F1 {
  int ff;
  ~G14x5y0(); // tgen
  G14x5y0(); // tgen
};
//SIG(1 G14x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x5y0 ::~G14x5y0(){ note_dtor("G14x5y0", this);} // tgen
G14x5y0 ::G14x5y0(){ note_ctor("G14x5y0", this);} // tgen

static void Test_G14x5y0()
{
  extern Class_Descriptor cd_G14x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x5y0, buf);
    G14x5y0 *dp, &lv = *(dp=new (buf) G14x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y0)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,32), "G14x5y0");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,36), "G14x5y0");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(32,24), "G14x5y0");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(8,4), "G14x5y0");
    check_base_class_offset(lv, (E14x5*), 0, "G14x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G14x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G14x5y0.ff");
    test_class_info(&lv, &cd_G14x5y0);
    dp->~G14x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y0(Test_G14x5y0, "G14x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x5y0C1Ev();
extern void _ZN7G14x5y0D1Ev();
Name_Map name_map_G14x5y0[] = {
  NSPAIR(_ZN7G14x5y0C1Ev),
  NSPAIR(_ZN7G14x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x5y0[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G14x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y0[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y0[] = {
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y0[] = {
  {&(_ZTV7G14x5y0[5]),  5,16},
  {&(_tg__ZTV5E14x5__7G14x5y0[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y0[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y0[3]),  3,4},
  {&(_ZTV7G14x5y0[12]),  12,16},
  {&(_ZTV7G14x5y0[15]),  15,16},
  {&(_tg__ZTV3C14__7G14x5y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y0[];
extern  VTBL_ENTRY _ZTV7G14x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y0[];
Class_Descriptor cd_G14x5y0 = {  "G14x5y0", // class name
  bases_G14x5y0, 6,
  &(vtc_G14x5y0[0]), // expected_vtbl_contents
  &(vtt_G14x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y0),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y1  : virtual E14x5 , F1 {
  int ff;
  ~G14x5y1(); // tgen
  G14x5y1(); // tgen
};
//SIG(1 G14x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x5y1 ::~G14x5y1(){ note_dtor("G14x5y1", this);} // tgen
G14x5y1 ::G14x5y1(){ note_ctor("G14x5y1", this);} // tgen

static void Test_G14x5y1()
{
  extern Class_Descriptor cd_G14x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x5y1, buf);
    G14x5y1 *dp, &lv = *(dp=new (buf) G14x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y1)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,32), "G14x5y1");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,36), "G14x5y1");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(32,24), "G14x5y1");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(24,16), "G14x5y1");
    check_base_class_offset(lv, (E14x5*), ABISELECT(16,12), "G14x5y1");
    check_base_class_offset(lv, (F1*), 0, "G14x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x5y1.ff");
    test_class_info(&lv, &cd_G14x5y1);
    dp->~G14x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y1(Test_G14x5y1, "G14x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x5y1C1Ev();
extern void _ZN7G14x5y1D1Ev();
Name_Map name_map_G14x5y1[] = {
  NSPAIR(_ZN7G14x5y1C1Ev),
  NSPAIR(_ZN7G14x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x5y1[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x5y1[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G14x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y1[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y1[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y1[] = {
  {&(_ZTV7G14x5y1[6]),  6,20},
  {&(_ZTV7G14x5y1[12]),  12,20},
  {&(_ZTV7G14x5y1[16]),  16,20},
  {&(_ZTV7G14x5y1[19]),  19,20},
  {&(_tg__ZTV5E14x5__7G14x5y1[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y1[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y1[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x5y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y1[];
extern  VTBL_ENTRY _ZTV7G14x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y1[];
Class_Descriptor cd_G14x5y1 = {  "G14x5y1", // class name
  bases_G14x5y1, 6,
  &(vtc_G14x5y1[0]), // expected_vtbl_contents
  &(vtt_G14x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y1),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y2  : E14x5 , virtual F1 {
  int ff;
  ~G14x5y2(); // tgen
  G14x5y2(); // tgen
};
//SIG(1 G14x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x5y2 ::~G14x5y2(){ note_dtor("G14x5y2", this);} // tgen
G14x5y2 ::G14x5y2(){ note_ctor("G14x5y2", this);} // tgen

static void Test_G14x5y2()
{
  extern Class_Descriptor cd_G14x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x5y2, buf);
    G14x5y2 *dp, &lv = *(dp=new (buf) G14x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y2)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,24), "G14x5y2");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,28), "G14x5y2");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(24,16), "G14x5y2");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(8,4), "G14x5y2");
    check_base_class_offset(lv, (E14x5*), 0, "G14x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G14x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x5y2.ff");
    test_class_info(&lv, &cd_G14x5y2);
    dp->~G14x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y2(Test_G14x5y2, "G14x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G14x5y2C1Ev();
extern void _ZN7G14x5y2D1Ev();
Name_Map name_map_G14x5y2[] = {
  NSPAIR(_ZN7G14x5y2C1Ev),
  NSPAIR(_ZN7G14x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y2[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G14x5y2[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G14x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y2[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y2[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y2[] = {
  {&(_ZTV7G14x5y2[6]),  6,18},
  {&(_tg__ZTV5E14x5__7G14x5y2[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y2[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y2[3]),  3,4},
  {&(_ZTV7G14x5y2[10]),  10,18},
  {&(_ZTV7G14x5y2[13]),  13,18},
  {&(_ZTV7G14x5y2[17]),  17,18},
  {&(_tg__ZTV3C14__7G14x5y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y2[];
extern  VTBL_ENTRY _ZTV7G14x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y2[];
Class_Descriptor cd_G14x5y2 = {  "G14x5y2", // class name
  bases_G14x5y2, 6,
  &(vtc_G14x5y2[0]), // expected_vtbl_contents
  &(vtt_G14x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G14x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y2),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y3  : virtual E14x5 , virtual F1 {
  int ff;
  ~G14x5y3(); // tgen
  G14x5y3(); // tgen
};
//SIG(1 G14x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x5y3 ::~G14x5y3(){ note_dtor("G14x5y3", this);} // tgen
G14x5y3 ::G14x5y3(){ note_ctor("G14x5y3", this);} // tgen

static void Test_G14x5y3()
{
  extern Class_Descriptor cd_G14x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G14x5y3, buf);
    G14x5y3 *dp, &lv = *(dp=new (buf) G14x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G14x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y3)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x5y3");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x5y3");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(32,20), "G14x5y3");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(24,12), "G14x5y3");
    check_base_class_offset(lv, (E14x5*), ABISELECT(16,8), "G14x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G14x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x5y3.ff");
    test_class_info(&lv, &cd_G14x5y3);
    dp->~G14x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y3(Test_G14x5y3, "G14x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G14x5y3C1Ev();
extern void _ZN7G14x5y3D1Ev();
Name_Map name_map_G14x5y3[] = {
  NSPAIR(_ZN7G14x5y3C1Ev),
  NSPAIR(_ZN7G14x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G14x5y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G14x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y3[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y3[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y3[] = {
  {&(_ZTV7G14x5y3[7]),  7,24},
  {&(_ZTV7G14x5y3[12]),  12,24},
  {&(_ZTV7G14x5y3[16]),  16,24},
  {&(_ZTV7G14x5y3[19]),  19,24},
  {&(_ZTV7G14x5y3[23]),  23,24},
  {&(_tg__ZTV5E14x5__7G14x5y3[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y3[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y3[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x5y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y3[];
extern  VTBL_ENTRY _ZTV7G14x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y3[];
Class_Descriptor cd_G14x5y3 = {  "G14x5y3", // class name
  bases_G14x5y3, 6,
  &(vtc_G14x5y3[0]), // expected_vtbl_contents
  &(vtt_G14x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G14x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y3),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y4  : E14x5 , F0 {
  int ff;
  ~G14x5y4(); // tgen
  G14x5y4(); // tgen
};
//SIG(1 G14x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G14x5y4 ::~G14x5y4(){ note_dtor("G14x5y4", this);} // tgen
G14x5y4 ::G14x5y4(){ note_ctor("G14x5y4", this);} // tgen

static void Test_G14x5y4()
{
  extern Class_Descriptor cd_G14x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x5y4, buf);
    G14x5y4 *dp, &lv = *(dp=new (buf) G14x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y4)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,28), "G14x5y4");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,32), "G14x5y4");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(24,20), "G14x5y4");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(8,4), "G14x5y4");
    check_base_class_offset(lv, (E14x5*), 0, "G14x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G14x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x5y4.ff");
    test_class_info(&lv, &cd_G14x5y4);
    dp->~G14x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y4(Test_G14x5y4, "G14x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x5y4C1Ev();
extern void _ZN7G14x5y4D1Ev();
Name_Map name_map_G14x5y4[] = {
  NSPAIR(_ZN7G14x5y4C1Ev),
  NSPAIR(_ZN7G14x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y4[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G14x5y4[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G14x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y4[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y4[] = {
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y4[] = {
  {&(_ZTV7G14x5y4[5]),  5,13},
  {&(_tg__ZTV5E14x5__7G14x5y4[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y4[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y4[3]),  3,4},
  {&(_ZTV7G14x5y4[9]),  9,13},
  {&(_ZTV7G14x5y4[12]),  12,13},
  {&(_tg__ZTV3C14__7G14x5y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y4[];
extern  VTBL_ENTRY _ZTV7G14x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y4[];
Class_Descriptor cd_G14x5y4 = {  "G14x5y4", // class name
  bases_G14x5y4, 6,
  &(vtc_G14x5y4[0]), // expected_vtbl_contents
  &(vtt_G14x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y4),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y5  : virtual E14x5 , F0 {
  int ff;
  ~G14x5y5(); // tgen
  G14x5y5(); // tgen
};
//SIG(1 G14x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G14x5y5 ::~G14x5y5(){ note_dtor("G14x5y5", this);} // tgen
G14x5y5 ::G14x5y5(){ note_ctor("G14x5y5", this);} // tgen

static void Test_G14x5y5()
{
  extern Class_Descriptor cd_G14x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x5y5, buf);
    G14x5y5 *dp, &lv = *(dp=new (buf) G14x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y5)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,32), "G14x5y5");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,36), "G14x5y5");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(32,24), "G14x5y5");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(24,16), "G14x5y5");
    check_base_class_offset(lv, (E14x5*), ABISELECT(16,12), "G14x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x5y5.ff");
    test_class_info(&lv, &cd_G14x5y5);
    dp->~G14x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y5(Test_G14x5y5, "G14x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x5y5C1Ev();
extern void _ZN7G14x5y5D1Ev();
Name_Map name_map_G14x5y5[] = {
  NSPAIR(_ZN7G14x5y5C1Ev),
  NSPAIR(_ZN7G14x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x5y5[0]),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G14x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y5[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y5[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y5[] = {
  {&(_ZTV7G14x5y5[6]),  6,19},
  {&(_ZTV7G14x5y5[11]),  11,19},
  {&(_ZTV7G14x5y5[15]),  15,19},
  {&(_ZTV7G14x5y5[18]),  18,19},
  {&(_tg__ZTV5E14x5__7G14x5y5[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y5[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y5[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x5y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y5[];
extern  VTBL_ENTRY _ZTV7G14x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y5[];
Class_Descriptor cd_G14x5y5 = {  "G14x5y5", // class name
  bases_G14x5y5, 6,
  &(vtc_G14x5y5[0]), // expected_vtbl_contents
  &(vtt_G14x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y5),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y6  : E14x5 , virtual F0 {
  int ff;
  ~G14x5y6(); // tgen
  G14x5y6(); // tgen
};
//SIG(1 G14x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x5y6 ::~G14x5y6(){ note_dtor("G14x5y6", this);} // tgen
G14x5y6 ::G14x5y6(){ note_ctor("G14x5y6", this);} // tgen

static void Test_G14x5y6()
{
  extern Class_Descriptor cd_G14x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x5y6, buf);
    G14x5y6 *dp, &lv = *(dp=new (buf) G14x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y6)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,24), "G14x5y6");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,28), "G14x5y6");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(24,16), "G14x5y6");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(8,4), "G14x5y6");
    check_base_class_offset(lv, (E14x5*), 0, "G14x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G14x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x5y6.ff");
    test_class_info(&lv, &cd_G14x5y6);
    dp->~G14x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y6(Test_G14x5y6, "G14x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x5y6C1Ev();
extern void _ZN7G14x5y6D1Ev();
Name_Map name_map_G14x5y6[] = {
  NSPAIR(_ZN7G14x5y6C1Ev),
  NSPAIR(_ZN7G14x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y6[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G14x5y6[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y6[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y6[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y6[] = {
  {&(_ZTV7G14x5y6[6]),  6,14},
  {&(_tg__ZTV5E14x5__7G14x5y6[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y6[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y6[3]),  3,4},
  {&(_ZTV7G14x5y6[10]),  10,14},
  {&(_ZTV7G14x5y6[13]),  13,14},
  {&(_tg__ZTV3C14__7G14x5y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y6[];
extern  VTBL_ENTRY _ZTV7G14x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y6[];
Class_Descriptor cd_G14x5y6 = {  "G14x5y6", // class name
  bases_G14x5y6, 6,
  &(vtc_G14x5y6[0]), // expected_vtbl_contents
  &(vtt_G14x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y6),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x5y7  : virtual E14x5 , virtual F0 {
  int ff;
  ~G14x5y7(); // tgen
  G14x5y7(); // tgen
};
//SIG(1 G14x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x5y7 ::~G14x5y7(){ note_dtor("G14x5y7", this);} // tgen
G14x5y7 ::G14x5y7(){ note_ctor("G14x5y7", this);} // tgen

static void Test_G14x5y7()
{
  extern Class_Descriptor cd_G14x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x5y7, buf);
    G14x5y7 *dp, &lv = *(dp=new (buf) G14x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x5y7)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x5y7");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x5y7");
    check_base_class_offset(lv, (C14*)(E14x5*), ABISELECT(32,20), "G14x5y7");
    check_base_class_offset(lv, (D0*)(E14x5*), ABISELECT(24,12), "G14x5y7");
    check_base_class_offset(lv, (E14x5*), ABISELECT(16,8), "G14x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G14x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x5y7.ff");
    test_class_info(&lv, &cd_G14x5y7);
    dp->~G14x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x5y7(Test_G14x5y7, "G14x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x5y7C1Ev();
extern void _ZN7G14x5y7D1Ev();
Name_Map name_map_G14x5y7[] = {
  NSPAIR(_ZN7G14x5y7C1Ev),
  NSPAIR(_ZN7G14x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x5;
extern VTBL_ENTRY _ZTI5E14x5[];
extern  VTBL_ENTRY _ZTV5E14x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E14x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x5y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G14x5y7[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x5y7[];
static  VTBL_ENTRY _tg__ZTV5E14x5__7G14x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x5__7G14x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x5__7G14x5y7[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x5y7[] = {
  {&(_ZTV7G14x5y7[7]),  7,20},
  {&(_ZTV7G14x5y7[12]),  12,20},
  {&(_ZTV7G14x5y7[16]),  16,20},
  {&(_ZTV7G14x5y7[19]),  19,20},
  {&(_tg__ZTV5E14x5__7G14x5y7[5]),  5,5},
  {&(_tg__ZTV3C14__5E14x5__7G14x5y7[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x5__7G14x5y7[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x5y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x5y7[];
extern  VTBL_ENTRY _ZTV7G14x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x5y7[];
Class_Descriptor cd_G14x5y7 = {  "G14x5y7", // class name
  bases_G14x5y7, 6,
  &(vtc_G14x5y7[0]), // expected_vtbl_contents
  &(vtt_G14x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x5y7),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E15x5  : virtual C15 , D0 {
  int fd;
  ~E15x5(); // tgen
  E15x5(); // tgen
};
//SIG(-1 E15x5) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v2 Fi} Fi} BC5{ Fi} Fi}


E15x5 ::~E15x5(){ note_dtor("E15x5", this);} // tgen
E15x5 ::E15x5(){ note_ctor("E15x5", this);} // tgen

static void Test_E15x5()
{
  extern Class_Descriptor cd_E15x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E15x5, buf);
    E15x5 *dp, &lv = *(dp=new (buf) E15x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E15x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x5)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,20), "E15x5");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,28), "E15x5");
    check_base_class_offset(lv, (C15*), ABISELECT(16,12), "E15x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E15x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E15x5.fd");
    test_class_info(&lv, &cd_E15x5);
    dp->~E15x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x5(Test_E15x5, "E15x5", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN5E15x5C1Ev();
extern void _ZN5E15x5D1Ev();
Name_Map name_map_E15x5[] = {
  NSPAIR(_ZN5E15x5C1Ev),
  NSPAIR(_ZN5E15x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E15x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E15x5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E15x5[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E15x5[];
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__5E15x5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__5E15x5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x5[] = {
  {&(_ZTV5E15x5[5]),  5,17},
  {&(_ZTV5E15x5[9]),  9,17},
  {&(_ZTV5E15x5[12]),  12,17},
  {&(_ZTV5E15x5[16]),  16,17},
  {&(_tg__ZTV3C15__5E15x5[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__5E15x5[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__5E15x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
Class_Descriptor cd_E15x5 = {  "E15x5", // class name
  bases_E15x5, 4,
  &(vtc_E15x5[0]), // expected_vtbl_contents
  &(vtt_E15x5[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI5E15x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E15x5),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E15x5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y0  : E15x5 , F1 {
  int ff;
  ~G15x5y0(); // tgen
  G15x5y0(); // tgen
};
//SIG(1 G15x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x5y0 ::~G15x5y0(){ note_dtor("G15x5y0", this);} // tgen
G15x5y0 ::G15x5y0(){ note_ctor("G15x5y0", this);} // tgen

static void Test_G15x5y0()
{
  extern Class_Descriptor cd_G15x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x5y0, buf);
    G15x5y0 *dp, &lv = *(dp=new (buf) G15x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y0)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,32), "G15x5y0");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,40), "G15x5y0");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(32,24), "G15x5y0");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(8,4), "G15x5y0");
    check_base_class_offset(lv, (E15x5*), 0, "G15x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G15x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G15x5y0.ff");
    test_class_info(&lv, &cd_G15x5y0);
    dp->~G15x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y0(Test_G15x5y0, "G15x5y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x5y0C1Ev();
extern void _ZN7G15x5y0D1Ev();
Name_Map name_map_G15x5y0[] = {
  NSPAIR(_ZN7G15x5y0C1Ev),
  NSPAIR(_ZN7G15x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,40), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x5y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x5y0[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x5y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G15x5y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y0[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y0[] = {
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y0[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y0[] = {
  {&(_ZTV7G15x5y0[5]),  5,20},
  {&(_tg__ZTV5E15x5__7G15x5y0[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y0[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y0[3]),  3,4},
  {&(_ZTV7G15x5y0[12]),  12,20},
  {&(_ZTV7G15x5y0[15]),  15,20},
  {&(_ZTV7G15x5y0[19]),  19,20},
  {&(_tg__ZTV3C15__7G15x5y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y0[];
extern  VTBL_ENTRY _ZTV7G15x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y0[];
Class_Descriptor cd_G15x5y0 = {  "G15x5y0", // class name
  bases_G15x5y0, 6,
  &(vtc_G15x5y0[0]), // expected_vtbl_contents
  &(vtt_G15x5y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y0),20, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y1  : virtual E15x5 , F1 {
  int ff;
  ~G15x5y1(); // tgen
  G15x5y1(); // tgen
};
//SIG(1 G15x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x5y1 ::~G15x5y1(){ note_dtor("G15x5y1", this);} // tgen
G15x5y1 ::G15x5y1(){ note_ctor("G15x5y1", this);} // tgen

static void Test_G15x5y1()
{
  extern Class_Descriptor cd_G15x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x5y1, buf);
    G15x5y1 *dp, &lv = *(dp=new (buf) G15x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y1)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,32), "G15x5y1");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,40), "G15x5y1");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(32,24), "G15x5y1");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(24,16), "G15x5y1");
    check_base_class_offset(lv, (E15x5*), ABISELECT(16,12), "G15x5y1");
    check_base_class_offset(lv, (F1*), 0, "G15x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x5y1.ff");
    test_class_info(&lv, &cd_G15x5y1);
    dp->~G15x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y1(Test_G15x5y1, "G15x5y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x5y1C1Ev();
extern void _ZN7G15x5y1D1Ev();
Name_Map name_map_G15x5y1[] = {
  NSPAIR(_ZN7G15x5y1C1Ev),
  NSPAIR(_ZN7G15x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,40), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x5y1[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x5y1[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x5y1[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x5y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G15x5y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y1[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y1[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y1[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y1[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y1[] = {
  {&(_ZTV7G15x5y1[6]),  6,24},
  {&(_ZTV7G15x5y1[12]),  12,24},
  {&(_ZTV7G15x5y1[16]),  16,24},
  {&(_ZTV7G15x5y1[19]),  19,24},
  {&(_ZTV7G15x5y1[23]),  23,24},
  {&(_tg__ZTV5E15x5__7G15x5y1[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y1[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y1[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x5y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y1[];
extern  VTBL_ENTRY _ZTV7G15x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y1[];
Class_Descriptor cd_G15x5y1 = {  "G15x5y1", // class name
  bases_G15x5y1, 6,
  &(vtc_G15x5y1[0]), // expected_vtbl_contents
  &(vtt_G15x5y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y1),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y2  : E15x5 , virtual F1 {
  int ff;
  ~G15x5y2(); // tgen
  G15x5y2(); // tgen
};
//SIG(1 G15x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x5y2 ::~G15x5y2(){ note_dtor("G15x5y2", this);} // tgen
G15x5y2 ::G15x5y2(){ note_ctor("G15x5y2", this);} // tgen

static void Test_G15x5y2()
{
  extern Class_Descriptor cd_G15x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G15x5y2, buf);
    G15x5y2 *dp, &lv = *(dp=new (buf) G15x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G15x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y2)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,24), "G15x5y2");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,32), "G15x5y2");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(24,16), "G15x5y2");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(8,4), "G15x5y2");
    check_base_class_offset(lv, (E15x5*), 0, "G15x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G15x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x5y2.ff");
    test_class_info(&lv, &cd_G15x5y2);
    dp->~G15x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y2(Test_G15x5y2, "G15x5y2", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G15x5y2C1Ev();
extern void _ZN7G15x5y2D1Ev();
Name_Map name_map_G15x5y2[] = {
  NSPAIR(_ZN7G15x5y2C1Ev),
  NSPAIR(_ZN7G15x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x5y2[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y2[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G15x5y2[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x5y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G15x5y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G15x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y2[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y2[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y2[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y2[] = {
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y2[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y2[] = {
  {&(_ZTV7G15x5y2[6]),  6,22},
  {&(_tg__ZTV5E15x5__7G15x5y2[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y2[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y2[3]),  3,4},
  {&(_ZTV7G15x5y2[10]),  10,22},
  {&(_ZTV7G15x5y2[13]),  13,22},
  {&(_ZTV7G15x5y2[17]),  17,22},
  {&(_ZTV7G15x5y2[21]),  21,22},
  {&(_tg__ZTV3C15__7G15x5y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y2[];
extern  VTBL_ENTRY _ZTV7G15x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y2[];
Class_Descriptor cd_G15x5y2 = {  "G15x5y2", // class name
  bases_G15x5y2, 6,
  &(vtc_G15x5y2[0]), // expected_vtbl_contents
  &(vtt_G15x5y2[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G15x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y2),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y3  : virtual E15x5 , virtual F1 {
  int ff;
  ~G15x5y3(); // tgen
  G15x5y3(); // tgen
};
//SIG(1 G15x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x5y3 ::~G15x5y3(){ note_dtor("G15x5y3", this);} // tgen
G15x5y3 ::G15x5y3(){ note_ctor("G15x5y3", this);} // tgen

static void Test_G15x5y3()
{
  extern Class_Descriptor cd_G15x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G15x5y3, buf);
    G15x5y3 *dp, &lv = *(dp=new (buf) G15x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G15x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y3)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x5y3");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x5y3");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(32,20), "G15x5y3");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(24,12), "G15x5y3");
    check_base_class_offset(lv, (E15x5*), ABISELECT(16,8), "G15x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G15x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x5y3.ff");
    test_class_info(&lv, &cd_G15x5y3);
    dp->~G15x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y3(Test_G15x5y3, "G15x5y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN7G15x5y3C1Ev();
extern void _ZN7G15x5y3D1Ev();
Name_Map name_map_G15x5y3[] = {
  NSPAIR(_ZN7G15x5y3C1Ev),
  NSPAIR(_ZN7G15x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    11, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(80,44), //bcp->offset
    24, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x5y3[] = {
  ABISELECT(80,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y3[0]),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x5y3[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x5y3[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x5y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G15x5y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI7G15x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y3[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y3[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y3[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y3[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y3[] = {
  {&(_ZTV7G15x5y3[7]),  7,28},
  {&(_ZTV7G15x5y3[12]),  12,28},
  {&(_ZTV7G15x5y3[16]),  16,28},
  {&(_ZTV7G15x5y3[19]),  19,28},
  {&(_ZTV7G15x5y3[23]),  23,28},
  {&(_ZTV7G15x5y3[27]),  27,28},
  {&(_tg__ZTV5E15x5__7G15x5y3[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y3[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y3[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x5y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y3[];
extern  VTBL_ENTRY _ZTV7G15x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y3[];
Class_Descriptor cd_G15x5y3 = {  "G15x5y3", // class name
  bases_G15x5y3, 6,
  &(vtc_G15x5y3[0]), // expected_vtbl_contents
  &(vtt_G15x5y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI7G15x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y3),28, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y4  : E15x5 , F0 {
  int ff;
  ~G15x5y4(); // tgen
  G15x5y4(); // tgen
};
//SIG(1 G15x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G15x5y4 ::~G15x5y4(){ note_dtor("G15x5y4", this);} // tgen
G15x5y4 ::G15x5y4(){ note_ctor("G15x5y4", this);} // tgen

static void Test_G15x5y4()
{
  extern Class_Descriptor cd_G15x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x5y4, buf);
    G15x5y4 *dp, &lv = *(dp=new (buf) G15x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y4)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,28), "G15x5y4");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,36), "G15x5y4");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(24,20), "G15x5y4");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(8,4), "G15x5y4");
    check_base_class_offset(lv, (E15x5*), 0, "G15x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G15x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x5y4.ff");
    test_class_info(&lv, &cd_G15x5y4);
    dp->~G15x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y4(Test_G15x5y4, "G15x5y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x5y4C1Ev();
extern void _ZN7G15x5y4D1Ev();
Name_Map name_map_G15x5y4[] = {
  NSPAIR(_ZN7G15x5y4C1Ev),
  NSPAIR(_ZN7G15x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x5y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y4[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G15x5y4[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x5y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G15x5y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y4[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y4[] = {
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y4[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y4[] = {
  {&(_ZTV7G15x5y4[5]),  5,17},
  {&(_tg__ZTV5E15x5__7G15x5y4[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y4[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y4[3]),  3,4},
  {&(_ZTV7G15x5y4[9]),  9,17},
  {&(_ZTV7G15x5y4[12]),  12,17},
  {&(_ZTV7G15x5y4[16]),  16,17},
  {&(_tg__ZTV3C15__7G15x5y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y4[];
extern  VTBL_ENTRY _ZTV7G15x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y4[];
Class_Descriptor cd_G15x5y4 = {  "G15x5y4", // class name
  bases_G15x5y4, 6,
  &(vtc_G15x5y4[0]), // expected_vtbl_contents
  &(vtt_G15x5y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y4),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y5  : virtual E15x5 , F0 {
  int ff;
  ~G15x5y5(); // tgen
  G15x5y5(); // tgen
};
//SIG(1 G15x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G15x5y5 ::~G15x5y5(){ note_dtor("G15x5y5", this);} // tgen
G15x5y5 ::G15x5y5(){ note_ctor("G15x5y5", this);} // tgen

static void Test_G15x5y5()
{
  extern Class_Descriptor cd_G15x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x5y5, buf);
    G15x5y5 *dp, &lv = *(dp=new (buf) G15x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y5)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,32), "G15x5y5");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,40), "G15x5y5");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(32,24), "G15x5y5");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(24,16), "G15x5y5");
    check_base_class_offset(lv, (E15x5*), ABISELECT(16,12), "G15x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x5y5.ff");
    test_class_info(&lv, &cd_G15x5y5);
    dp->~G15x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y5(Test_G15x5y5, "G15x5y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x5y5C1Ev();
extern void _ZN7G15x5y5D1Ev();
Name_Map name_map_G15x5y5[] = {
  NSPAIR(_ZN7G15x5y5C1Ev),
  NSPAIR(_ZN7G15x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x5y5[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y5[0]),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x5y5[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x5y5[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x5y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G15x5y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y5[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y5[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y5[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y5[] = {
  {&(_ZTV7G15x5y5[6]),  6,23},
  {&(_ZTV7G15x5y5[11]),  11,23},
  {&(_ZTV7G15x5y5[15]),  15,23},
  {&(_ZTV7G15x5y5[18]),  18,23},
  {&(_ZTV7G15x5y5[22]),  22,23},
  {&(_tg__ZTV5E15x5__7G15x5y5[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y5[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y5[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x5y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y5[];
extern  VTBL_ENTRY _ZTV7G15x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y5[];
Class_Descriptor cd_G15x5y5 = {  "G15x5y5", // class name
  bases_G15x5y5, 6,
  &(vtc_G15x5y5[0]), // expected_vtbl_contents
  &(vtt_G15x5y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y5),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y6  : E15x5 , virtual F0 {
  int ff;
  ~G15x5y6(); // tgen
  G15x5y6(); // tgen
};
//SIG(1 G15x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x5y6 ::~G15x5y6(){ note_dtor("G15x5y6", this);} // tgen
G15x5y6 ::G15x5y6(){ note_ctor("G15x5y6", this);} // tgen

static void Test_G15x5y6()
{
  extern Class_Descriptor cd_G15x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x5y6, buf);
    G15x5y6 *dp, &lv = *(dp=new (buf) G15x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y6)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,24), "G15x5y6");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,32), "G15x5y6");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(24,16), "G15x5y6");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(8,4), "G15x5y6");
    check_base_class_offset(lv, (E15x5*), 0, "G15x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G15x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x5y6.ff");
    test_class_info(&lv, &cd_G15x5y6);
    dp->~G15x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y6(Test_G15x5y6, "G15x5y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x5y6C1Ev();
extern void _ZN7G15x5y6D1Ev();
Name_Map name_map_G15x5y6[] = {
  NSPAIR(_ZN7G15x5y6C1Ev),
  NSPAIR(_ZN7G15x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x5y6[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y6[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G15x5y6[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x5y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G15x5y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y6[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y6[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y6[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y6[] = {
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y6[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y6[] = {
  {&(_ZTV7G15x5y6[6]),  6,18},
  {&(_tg__ZTV5E15x5__7G15x5y6[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y6[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y6[3]),  3,4},
  {&(_ZTV7G15x5y6[10]),  10,18},
  {&(_ZTV7G15x5y6[13]),  13,18},
  {&(_ZTV7G15x5y6[17]),  17,18},
  {&(_tg__ZTV3C15__7G15x5y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y6[];
extern  VTBL_ENTRY _ZTV7G15x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y6[];
Class_Descriptor cd_G15x5y6 = {  "G15x5y6", // class name
  bases_G15x5y6, 6,
  &(vtc_G15x5y6[0]), // expected_vtbl_contents
  &(vtt_G15x5y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y6),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x5y7  : virtual E15x5 , virtual F0 {
  int ff;
  ~G15x5y7(); // tgen
  G15x5y7(); // tgen
};
//SIG(1 G15x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x5y7 ::~G15x5y7(){ note_dtor("G15x5y7", this);} // tgen
G15x5y7 ::G15x5y7(){ note_ctor("G15x5y7", this);} // tgen

static void Test_G15x5y7()
{
  extern Class_Descriptor cd_G15x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x5y7, buf);
    G15x5y7 *dp, &lv = *(dp=new (buf) G15x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x5y7)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x5y7");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x5y7");
    check_base_class_offset(lv, (C15*)(E15x5*), ABISELECT(32,20), "G15x5y7");
    check_base_class_offset(lv, (D0*)(E15x5*), ABISELECT(24,12), "G15x5y7");
    check_base_class_offset(lv, (E15x5*), ABISELECT(16,8), "G15x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(76,44), "G15x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x5y7.ff");
    test_class_info(&lv, &cd_G15x5y7);
    dp->~G15x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x5y7(Test_G15x5y7, "G15x5y7", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x5y7C1Ev();
extern void _ZN7G15x5y7D1Ev();
Name_Map name_map_G15x5y7[] = {
  NSPAIR(_ZN7G15x5y7C1Ev),
  NSPAIR(_ZN7G15x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x5;
extern VTBL_ENTRY _ZTI5E15x5[];
extern  VTBL_ENTRY _ZTV5E15x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E15x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x5y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x5y7[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x5y7[0]),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x5y7[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x5y7[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x5y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G15x5y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x5y7[];
static  VTBL_ENTRY _tg__ZTV5E15x5__7G15x5y7[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x5__7G15x5y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x5__7G15x5y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x5__7G15x5y7[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x5y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x5y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x5y7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x5y7[] = {
  {&(_ZTV7G15x5y7[7]),  7,24},
  {&(_ZTV7G15x5y7[12]),  12,24},
  {&(_ZTV7G15x5y7[16]),  16,24},
  {&(_ZTV7G15x5y7[19]),  19,24},
  {&(_ZTV7G15x5y7[23]),  23,24},
  {&(_tg__ZTV5E15x5__7G15x5y7[5]),  5,5},
  {&(_tg__ZTV3C15__5E15x5__7G15x5y7[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x5__7G15x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x5__7G15x5y7[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x5y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x5y7[];
extern  VTBL_ENTRY _ZTV7G15x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x5y7[];
Class_Descriptor cd_G15x5y7 = {  "G15x5y7", // class name
  bases_G15x5y7, 6,
  &(vtc_G15x5y7[0]), // expected_vtbl_contents
  &(vtt_G15x5y7[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x5y7),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x5y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E16x5  : virtual C16 , D0 {
  int fd;
  ~E16x5(); // tgen
  E16x5(); // tgen
};
//SIG(-1 E16x5) C1{ VBC2{ BC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E16x5 ::~E16x5(){ note_dtor("E16x5", this);} // tgen
E16x5 ::E16x5(){ note_ctor("E16x5", this);} // tgen

static void Test_E16x5()
{
  extern Class_Descriptor cd_E16x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E16x5, buf);
    E16x5 *dp, &lv = *(dp=new (buf) E16x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E16x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x5)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,16), "E16x5");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,20), "E16x5");
    check_base_class_offset(lv, (C16*), ABISELECT(16,12), "E16x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E16x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E16x5.fd");
    test_class_info(&lv, &cd_E16x5);
    dp->~E16x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x5(Test_E16x5, "E16x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E16x5C1Ev();
extern void _ZN5E16x5D1Ev();
Name_Map name_map_E16x5[] = {
  NSPAIR(_ZN5E16x5C1Ev),
  NSPAIR(_ZN5E16x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E16x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E16x5[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_E16x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV5E16x5[];
static  VTT_ENTRY vtt_E16x5[] = {
  {&(_ZTV5E16x5[3]),  3,7},
  {&(_ZTV5E16x5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
Class_Descriptor cd_E16x5 = {  "E16x5", // class name
  bases_E16x5, 4,
  &(vtc_E16x5[0]), // expected_vtbl_contents
  &(vtt_E16x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E16x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E16x5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E16x5),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y0  : E16x5 , F1 {
  int ff;
  ~G16x5y0(); // tgen
  G16x5y0(); // tgen
};
//SIG(1 G16x5y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x5y0 ::~G16x5y0(){ note_dtor("G16x5y0", this);} // tgen
G16x5y0 ::G16x5y0(){ note_ctor("G16x5y0", this);} // tgen

static void Test_G16x5y0()
{
  extern Class_Descriptor cd_G16x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x5y0, buf);
    G16x5y0 *dp, &lv = *(dp=new (buf) G16x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y0)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,28), "G16x5y0");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,32), "G16x5y0");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(32,24), "G16x5y0");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(8,4), "G16x5y0");
    check_base_class_offset(lv, (E16x5*), 0, "G16x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G16x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G16x5y0.ff");
    test_class_info(&lv, &cd_G16x5y0);
    dp->~G16x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y0(Test_G16x5y0, "G16x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x5y0C1Ev();
extern void _ZN7G16x5y0D1Ev();
Name_Map name_map_G16x5y0[] = {
  NSPAIR(_ZN7G16x5y0C1Ev),
  NSPAIR(_ZN7G16x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G16x5y0[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y0[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y0[] = {
  {&(_ZTV7G16x5y0[3]),  3,10},
  {&(_tg__ZTV5E16x5__7G16x5y0[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y0[3]),  3,4},
  {&(_ZTV7G16x5y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G16x5y0[];
extern  VTBL_ENTRY _ZTV7G16x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y0[];
Class_Descriptor cd_G16x5y0 = {  "G16x5y0", // class name
  bases_G16x5y0, 6,
  &(vtc_G16x5y0[0]), // expected_vtbl_contents
  &(vtt_G16x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y0),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y1  : virtual E16x5 , F1 {
  int ff;
  ~G16x5y1(); // tgen
  G16x5y1(); // tgen
};
//SIG(1 G16x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x5y1 ::~G16x5y1(){ note_dtor("G16x5y1", this);} // tgen
G16x5y1 ::G16x5y1(){ note_ctor("G16x5y1", this);} // tgen

static void Test_G16x5y1()
{
  extern Class_Descriptor cd_G16x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x5y1, buf);
    G16x5y1 *dp, &lv = *(dp=new (buf) G16x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y1)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,28), "G16x5y1");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,32), "G16x5y1");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(32,24), "G16x5y1");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(24,16), "G16x5y1");
    check_base_class_offset(lv, (E16x5*), ABISELECT(16,12), "G16x5y1");
    check_base_class_offset(lv, (F1*), 0, "G16x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x5y1.ff");
    test_class_info(&lv, &cd_G16x5y1);
    dp->~G16x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y1(Test_G16x5y1, "G16x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x5y1C1Ev();
extern void _ZN7G16x5y1D1Ev();
Name_Map name_map_G16x5y1[] = {
  NSPAIR(_ZN7G16x5y1C1Ev),
  NSPAIR(_ZN7G16x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G16x5y1[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y1[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y1[] = {
  {&(_ZTV7G16x5y1[4]),  4,12},
  {&(_ZTV7G16x5y1[8]),  8,12},
  {&(_ZTV7G16x5y1[11]),  11,12},
  {&(_tg__ZTV5E16x5__7G16x5y1[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x5y1[];
extern  VTBL_ENTRY _ZTV7G16x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y1[];
Class_Descriptor cd_G16x5y1 = {  "G16x5y1", // class name
  bases_G16x5y1, 6,
  &(vtc_G16x5y1[0]), // expected_vtbl_contents
  &(vtt_G16x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y1),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y2  : E16x5 , virtual F1 {
  int ff;
  ~G16x5y2(); // tgen
  G16x5y2(); // tgen
};
//SIG(1 G16x5y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x5y2 ::~G16x5y2(){ note_dtor("G16x5y2", this);} // tgen
G16x5y2 ::G16x5y2(){ note_ctor("G16x5y2", this);} // tgen

static void Test_G16x5y2()
{
  extern Class_Descriptor cd_G16x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x5y2, buf);
    G16x5y2 *dp, &lv = *(dp=new (buf) G16x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y2)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,20), "G16x5y2");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,24), "G16x5y2");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(24,16), "G16x5y2");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(8,4), "G16x5y2");
    check_base_class_offset(lv, (E16x5*), 0, "G16x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G16x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G16x5y2.ff");
    test_class_info(&lv, &cd_G16x5y2);
    dp->~G16x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y2(Test_G16x5y2, "G16x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G16x5y2C1Ev();
extern void _ZN7G16x5y2D1Ev();
Name_Map name_map_G16x5y2[] = {
  NSPAIR(_ZN7G16x5y2C1Ev),
  NSPAIR(_ZN7G16x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y2[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G16x5y2[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G16x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y2[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y2[] = {
  {&(_ZTV7G16x5y2[4]),  4,12},
  {&(_tg__ZTV5E16x5__7G16x5y2[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y2[3]),  3,4},
  {&(_ZTV7G16x5y2[7]),  7,12},
  {&(_ZTV7G16x5y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G16x5y2[];
extern  VTBL_ENTRY _ZTV7G16x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y2[];
Class_Descriptor cd_G16x5y2 = {  "G16x5y2", // class name
  bases_G16x5y2, 6,
  &(vtc_G16x5y2[0]), // expected_vtbl_contents
  &(vtt_G16x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G16x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y2),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y3  : virtual E16x5 , virtual F1 {
  int ff;
  ~G16x5y3(); // tgen
  G16x5y3(); // tgen
};
//SIG(1 G16x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x5y3 ::~G16x5y3(){ note_dtor("G16x5y3", this);} // tgen
G16x5y3 ::G16x5y3(){ note_ctor("G16x5y3", this);} // tgen

static void Test_G16x5y3()
{
  extern Class_Descriptor cd_G16x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G16x5y3, buf);
    G16x5y3 *dp, &lv = *(dp=new (buf) G16x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G16x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y3)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x5y3");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x5y3");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(32,20), "G16x5y3");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(24,12), "G16x5y3");
    check_base_class_offset(lv, (E16x5*), ABISELECT(16,8), "G16x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G16x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x5y3.ff");
    test_class_info(&lv, &cd_G16x5y3);
    dp->~G16x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y3(Test_G16x5y3, "G16x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G16x5y3C1Ev();
extern void _ZN7G16x5y3D1Ev();
Name_Map name_map_G16x5y3[] = {
  NSPAIR(_ZN7G16x5y3C1Ev),
  NSPAIR(_ZN7G16x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y3[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G16x5y3[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G16x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y3[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y3[] = {
  {&(_ZTV7G16x5y3[5]),  5,16},
  {&(_ZTV7G16x5y3[8]),  8,16},
  {&(_ZTV7G16x5y3[11]),  11,16},
  {&(_ZTV7G16x5y3[15]),  15,16},
  {&(_tg__ZTV5E16x5__7G16x5y3[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x5y3[];
extern  VTBL_ENTRY _ZTV7G16x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y3[];
Class_Descriptor cd_G16x5y3 = {  "G16x5y3", // class name
  bases_G16x5y3, 6,
  &(vtc_G16x5y3[0]), // expected_vtbl_contents
  &(vtt_G16x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G16x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y3),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y4  : E16x5 , F0 {
  int ff;
  ~G16x5y4(); // tgen
  G16x5y4(); // tgen
};
//SIG(1 G16x5y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G16x5y4 ::~G16x5y4(){ note_dtor("G16x5y4", this);} // tgen
G16x5y4 ::G16x5y4(){ note_ctor("G16x5y4", this);} // tgen

static void Test_G16x5y4()
{
  extern Class_Descriptor cd_G16x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x5y4, buf);
    G16x5y4 *dp, &lv = *(dp=new (buf) G16x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y4)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,24), "G16x5y4");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,28), "G16x5y4");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(24,20), "G16x5y4");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(8,4), "G16x5y4");
    check_base_class_offset(lv, (E16x5*), 0, "G16x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G16x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G16x5y4.ff");
    test_class_info(&lv, &cd_G16x5y4);
    dp->~G16x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y4(Test_G16x5y4, "G16x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x5y4C1Ev();
extern void _ZN7G16x5y4D1Ev();
Name_Map name_map_G16x5y4[] = {
  NSPAIR(_ZN7G16x5y4C1Ev),
  NSPAIR(_ZN7G16x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y4[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G16x5y4[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y4[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y4[] = {
  {&(_ZTV7G16x5y4[3]),  3,7},
  {&(_tg__ZTV5E16x5__7G16x5y4[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y4[3]),  3,4},
  {&(_ZTV7G16x5y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G16x5y4[];
extern  VTBL_ENTRY _ZTV7G16x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y4[];
Class_Descriptor cd_G16x5y4 = {  "G16x5y4", // class name
  bases_G16x5y4, 6,
  &(vtc_G16x5y4[0]), // expected_vtbl_contents
  &(vtt_G16x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y5  : virtual E16x5 , F0 {
  int ff;
  ~G16x5y5(); // tgen
  G16x5y5(); // tgen
};
//SIG(1 G16x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G16x5y5 ::~G16x5y5(){ note_dtor("G16x5y5", this);} // tgen
G16x5y5 ::G16x5y5(){ note_ctor("G16x5y5", this);} // tgen

static void Test_G16x5y5()
{
  extern Class_Descriptor cd_G16x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x5y5, buf);
    G16x5y5 *dp, &lv = *(dp=new (buf) G16x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y5)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,28), "G16x5y5");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,32), "G16x5y5");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(32,24), "G16x5y5");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(24,16), "G16x5y5");
    check_base_class_offset(lv, (E16x5*), ABISELECT(16,12), "G16x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x5y5.ff");
    test_class_info(&lv, &cd_G16x5y5);
    dp->~G16x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y5(Test_G16x5y5, "G16x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x5y5C1Ev();
extern void _ZN7G16x5y5D1Ev();
Name_Map name_map_G16x5y5[] = {
  NSPAIR(_ZN7G16x5y5C1Ev),
  NSPAIR(_ZN7G16x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y5[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G16x5y5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y5[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y5[] = {
  {&(_ZTV7G16x5y5[4]),  4,11},
  {&(_ZTV7G16x5y5[7]),  7,11},
  {&(_ZTV7G16x5y5[10]),  10,11},
  {&(_tg__ZTV5E16x5__7G16x5y5[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x5y5[];
extern  VTBL_ENTRY _ZTV7G16x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y5[];
Class_Descriptor cd_G16x5y5 = {  "G16x5y5", // class name
  bases_G16x5y5, 6,
  &(vtc_G16x5y5[0]), // expected_vtbl_contents
  &(vtt_G16x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y6  : E16x5 , virtual F0 {
  int ff;
  ~G16x5y6(); // tgen
  G16x5y6(); // tgen
};
//SIG(1 G16x5y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x5y6 ::~G16x5y6(){ note_dtor("G16x5y6", this);} // tgen
G16x5y6 ::G16x5y6(){ note_ctor("G16x5y6", this);} // tgen

static void Test_G16x5y6()
{
  extern Class_Descriptor cd_G16x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x5y6, buf);
    G16x5y6 *dp, &lv = *(dp=new (buf) G16x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y6)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,20), "G16x5y6");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,24), "G16x5y6");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(24,16), "G16x5y6");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(8,4), "G16x5y6");
    check_base_class_offset(lv, (E16x5*), 0, "G16x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G16x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G16x5y6.ff");
    test_class_info(&lv, &cd_G16x5y6);
    dp->~G16x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y6(Test_G16x5y6, "G16x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x5y6C1Ev();
extern void _ZN7G16x5y6D1Ev();
Name_Map name_map_G16x5y6[] = {
  NSPAIR(_ZN7G16x5y6C1Ev),
  NSPAIR(_ZN7G16x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y6[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G16x5y6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y6[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y6[] = {
  {&(_ZTV7G16x5y6[4]),  4,8},
  {&(_tg__ZTV5E16x5__7G16x5y6[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y6[3]),  3,4},
  {&(_ZTV7G16x5y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G16x5y6[];
extern  VTBL_ENTRY _ZTV7G16x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y6[];
Class_Descriptor cd_G16x5y6 = {  "G16x5y6", // class name
  bases_G16x5y6, 6,
  &(vtc_G16x5y6[0]), // expected_vtbl_contents
  &(vtt_G16x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x5y7  : virtual E16x5 , virtual F0 {
  int ff;
  ~G16x5y7(); // tgen
  G16x5y7(); // tgen
};
//SIG(1 G16x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x5y7 ::~G16x5y7(){ note_dtor("G16x5y7", this);} // tgen
G16x5y7 ::G16x5y7(){ note_ctor("G16x5y7", this);} // tgen

static void Test_G16x5y7()
{
  extern Class_Descriptor cd_G16x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x5y7, buf);
    G16x5y7 *dp, &lv = *(dp=new (buf) G16x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x5y7)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x5y7");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x5y7");
    check_base_class_offset(lv, (C16*)(E16x5*), ABISELECT(32,20), "G16x5y7");
    check_base_class_offset(lv, (D0*)(E16x5*), ABISELECT(24,12), "G16x5y7");
    check_base_class_offset(lv, (E16x5*), ABISELECT(16,8), "G16x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G16x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x5y7.ff");
    test_class_info(&lv, &cd_G16x5y7);
    dp->~G16x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x5y7(Test_G16x5y7, "G16x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x5y7C1Ev();
extern void _ZN7G16x5y7D1Ev();
Name_Map name_map_G16x5y7[] = {
  NSPAIR(_ZN7G16x5y7C1Ev),
  NSPAIR(_ZN7G16x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x5;
extern VTBL_ENTRY _ZTI5E16x5[];
extern  VTBL_ENTRY _ZTV5E16x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E16x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x5y7[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G16x5y7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x5y7[];
static  VTBL_ENTRY _tg__ZTV5E16x5__7G16x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x5__7G16x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x5y7[] = {
  {&(_ZTV7G16x5y7[5]),  5,12},
  {&(_ZTV7G16x5y7[8]),  8,12},
  {&(_ZTV7G16x5y7[11]),  11,12},
  {&(_tg__ZTV5E16x5__7G16x5y7[3]),  3,3},
  {&(_tg__ZTV3C16__5E16x5__7G16x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x5y7[];
extern  VTBL_ENTRY _ZTV7G16x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x5y7[];
Class_Descriptor cd_G16x5y7 = {  "G16x5y7", // class name
  bases_G16x5y7, 6,
  &(vtc_G16x5y7[0]), // expected_vtbl_contents
  &(vtt_G16x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x5y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x5y7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E17x5  : virtual C17 , D0 {
  int fd;
  ~E17x5(); // tgen
  E17x5(); // tgen
};
//SIG(-1 E17x5) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E17x5 ::~E17x5(){ note_dtor("E17x5", this);} // tgen
E17x5 ::E17x5(){ note_ctor("E17x5", this);} // tgen

static void Test_E17x5()
{
  extern Class_Descriptor cd_E17x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E17x5, buf);
    E17x5 *dp, &lv = *(dp=new (buf) E17x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E17x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x5)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,12), "E17x5");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,20), "E17x5");
    check_base_class_offset(lv, (C17*), ABISELECT(16,12), "E17x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E17x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E17x5.fd");
    test_class_info(&lv, &cd_E17x5);
    dp->~E17x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x5(Test_E17x5, "E17x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E17x5C1Ev();
extern void _ZN5E17x5D1Ev();
Name_Map name_map_E17x5[] = {
  NSPAIR(_ZN5E17x5C1Ev),
  NSPAIR(_ZN5E17x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E17x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E17x5[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_E17x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV5E17x5[];
static  VTT_ENTRY vtt_E17x5[] = {
  {&(_ZTV5E17x5[3]),  3,7},
  {&(_ZTV5E17x5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
Class_Descriptor cd_E17x5 = {  "E17x5", // class name
  bases_E17x5, 4,
  &(vtc_E17x5[0]), // expected_vtbl_contents
  &(vtt_E17x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E17x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E17x5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E17x5),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y0  : E17x5 , F1 {
  int ff;
  ~G17x5y0(); // tgen
  G17x5y0(); // tgen
};
//SIG(1 G17x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x5y0 ::~G17x5y0(){ note_dtor("G17x5y0", this);} // tgen
G17x5y0 ::G17x5y0(){ note_ctor("G17x5y0", this);} // tgen

static void Test_G17x5y0()
{
  extern Class_Descriptor cd_G17x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x5y0, buf);
    G17x5y0 *dp, &lv = *(dp=new (buf) G17x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y0)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,24), "G17x5y0");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,32), "G17x5y0");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(32,24), "G17x5y0");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(8,4), "G17x5y0");
    check_base_class_offset(lv, (E17x5*), 0, "G17x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G17x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G17x5y0.ff");
    test_class_info(&lv, &cd_G17x5y0);
    dp->~G17x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y0(Test_G17x5y0, "G17x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x5y0C1Ev();
extern void _ZN7G17x5y0D1Ev();
Name_Map name_map_G17x5y0[] = {
  NSPAIR(_ZN7G17x5y0C1Ev),
  NSPAIR(_ZN7G17x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G17x5y0[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y0[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y0[] = {
  {&(_ZTV7G17x5y0[3]),  3,10},
  {&(_tg__ZTV5E17x5__7G17x5y0[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y0[3]),  3,4},
  {&(_ZTV7G17x5y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G17x5y0[];
extern  VTBL_ENTRY _ZTV7G17x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y0[];
Class_Descriptor cd_G17x5y0 = {  "G17x5y0", // class name
  bases_G17x5y0, 6,
  &(vtc_G17x5y0[0]), // expected_vtbl_contents
  &(vtt_G17x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y1  : virtual E17x5 , F1 {
  int ff;
  ~G17x5y1(); // tgen
  G17x5y1(); // tgen
};
//SIG(1 G17x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x5y1 ::~G17x5y1(){ note_dtor("G17x5y1", this);} // tgen
G17x5y1 ::G17x5y1(){ note_ctor("G17x5y1", this);} // tgen

static void Test_G17x5y1()
{
  extern Class_Descriptor cd_G17x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x5y1, buf);
    G17x5y1 *dp, &lv = *(dp=new (buf) G17x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y1)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,24), "G17x5y1");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,32), "G17x5y1");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(32,24), "G17x5y1");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(24,16), "G17x5y1");
    check_base_class_offset(lv, (E17x5*), ABISELECT(16,12), "G17x5y1");
    check_base_class_offset(lv, (F1*), 0, "G17x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x5y1.ff");
    test_class_info(&lv, &cd_G17x5y1);
    dp->~G17x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y1(Test_G17x5y1, "G17x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x5y1C1Ev();
extern void _ZN7G17x5y1D1Ev();
Name_Map name_map_G17x5y1[] = {
  NSPAIR(_ZN7G17x5y1C1Ev),
  NSPAIR(_ZN7G17x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G17x5y1[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y1[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y1[] = {
  {&(_ZTV7G17x5y1[4]),  4,12},
  {&(_ZTV7G17x5y1[8]),  8,12},
  {&(_ZTV7G17x5y1[11]),  11,12},
  {&(_tg__ZTV5E17x5__7G17x5y1[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x5y1[];
extern  VTBL_ENTRY _ZTV7G17x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y1[];
Class_Descriptor cd_G17x5y1 = {  "G17x5y1", // class name
  bases_G17x5y1, 6,
  &(vtc_G17x5y1[0]), // expected_vtbl_contents
  &(vtt_G17x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y2  : E17x5 , virtual F1 {
  int ff;
  ~G17x5y2(); // tgen
  G17x5y2(); // tgen
};
//SIG(1 G17x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x5y2 ::~G17x5y2(){ note_dtor("G17x5y2", this);} // tgen
G17x5y2 ::G17x5y2(){ note_ctor("G17x5y2", this);} // tgen

static void Test_G17x5y2()
{
  extern Class_Descriptor cd_G17x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x5y2, buf);
    G17x5y2 *dp, &lv = *(dp=new (buf) G17x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y2)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,16), "G17x5y2");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,24), "G17x5y2");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(24,16), "G17x5y2");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(8,4), "G17x5y2");
    check_base_class_offset(lv, (E17x5*), 0, "G17x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G17x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G17x5y2.ff");
    test_class_info(&lv, &cd_G17x5y2);
    dp->~G17x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y2(Test_G17x5y2, "G17x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G17x5y2C1Ev();
extern void _ZN7G17x5y2D1Ev();
Name_Map name_map_G17x5y2[] = {
  NSPAIR(_ZN7G17x5y2C1Ev),
  NSPAIR(_ZN7G17x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y2[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G17x5y2[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G17x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y2[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y2[] = {
  {&(_ZTV7G17x5y2[4]),  4,12},
  {&(_tg__ZTV5E17x5__7G17x5y2[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y2[3]),  3,4},
  {&(_ZTV7G17x5y2[7]),  7,12},
  {&(_ZTV7G17x5y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G17x5y2[];
extern  VTBL_ENTRY _ZTV7G17x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y2[];
Class_Descriptor cd_G17x5y2 = {  "G17x5y2", // class name
  bases_G17x5y2, 6,
  &(vtc_G17x5y2[0]), // expected_vtbl_contents
  &(vtt_G17x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G17x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y3  : virtual E17x5 , virtual F1 {
  int ff;
  ~G17x5y3(); // tgen
  G17x5y3(); // tgen
};
//SIG(1 G17x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x5y3 ::~G17x5y3(){ note_dtor("G17x5y3", this);} // tgen
G17x5y3 ::G17x5y3(){ note_ctor("G17x5y3", this);} // tgen

static void Test_G17x5y3()
{
  extern Class_Descriptor cd_G17x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G17x5y3, buf);
    G17x5y3 *dp, &lv = *(dp=new (buf) G17x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G17x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y3)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x5y3");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x5y3");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(32,20), "G17x5y3");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(24,12), "G17x5y3");
    check_base_class_offset(lv, (E17x5*), ABISELECT(16,8), "G17x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G17x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x5y3.ff");
    test_class_info(&lv, &cd_G17x5y3);
    dp->~G17x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y3(Test_G17x5y3, "G17x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G17x5y3C1Ev();
extern void _ZN7G17x5y3D1Ev();
Name_Map name_map_G17x5y3[] = {
  NSPAIR(_ZN7G17x5y3C1Ev),
  NSPAIR(_ZN7G17x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y3[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G17x5y3[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G17x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y3[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y3[] = {
  {&(_ZTV7G17x5y3[5]),  5,16},
  {&(_ZTV7G17x5y3[8]),  8,16},
  {&(_ZTV7G17x5y3[11]),  11,16},
  {&(_ZTV7G17x5y3[15]),  15,16},
  {&(_tg__ZTV5E17x5__7G17x5y3[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x5y3[];
extern  VTBL_ENTRY _ZTV7G17x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y3[];
Class_Descriptor cd_G17x5y3 = {  "G17x5y3", // class name
  bases_G17x5y3, 6,
  &(vtc_G17x5y3[0]), // expected_vtbl_contents
  &(vtt_G17x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G17x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y4  : E17x5 , F0 {
  int ff;
  ~G17x5y4(); // tgen
  G17x5y4(); // tgen
};
//SIG(1 G17x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G17x5y4 ::~G17x5y4(){ note_dtor("G17x5y4", this);} // tgen
G17x5y4 ::G17x5y4(){ note_ctor("G17x5y4", this);} // tgen

static void Test_G17x5y4()
{
  extern Class_Descriptor cd_G17x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x5y4, buf);
    G17x5y4 *dp, &lv = *(dp=new (buf) G17x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y4)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,20), "G17x5y4");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,28), "G17x5y4");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(24,20), "G17x5y4");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(8,4), "G17x5y4");
    check_base_class_offset(lv, (E17x5*), 0, "G17x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G17x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G17x5y4.ff");
    test_class_info(&lv, &cd_G17x5y4);
    dp->~G17x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y4(Test_G17x5y4, "G17x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x5y4C1Ev();
extern void _ZN7G17x5y4D1Ev();
Name_Map name_map_G17x5y4[] = {
  NSPAIR(_ZN7G17x5y4C1Ev),
  NSPAIR(_ZN7G17x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y4[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G17x5y4[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y4[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y4[] = {
  {&(_ZTV7G17x5y4[3]),  3,7},
  {&(_tg__ZTV5E17x5__7G17x5y4[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y4[3]),  3,4},
  {&(_ZTV7G17x5y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G17x5y4[];
extern  VTBL_ENTRY _ZTV7G17x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y4[];
Class_Descriptor cd_G17x5y4 = {  "G17x5y4", // class name
  bases_G17x5y4, 6,
  &(vtc_G17x5y4[0]), // expected_vtbl_contents
  &(vtt_G17x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y5  : virtual E17x5 , F0 {
  int ff;
  ~G17x5y5(); // tgen
  G17x5y5(); // tgen
};
//SIG(1 G17x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G17x5y5 ::~G17x5y5(){ note_dtor("G17x5y5", this);} // tgen
G17x5y5 ::G17x5y5(){ note_ctor("G17x5y5", this);} // tgen

static void Test_G17x5y5()
{
  extern Class_Descriptor cd_G17x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x5y5, buf);
    G17x5y5 *dp, &lv = *(dp=new (buf) G17x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y5)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,24), "G17x5y5");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,32), "G17x5y5");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(32,24), "G17x5y5");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(24,16), "G17x5y5");
    check_base_class_offset(lv, (E17x5*), ABISELECT(16,12), "G17x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x5y5.ff");
    test_class_info(&lv, &cd_G17x5y5);
    dp->~G17x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y5(Test_G17x5y5, "G17x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x5y5C1Ev();
extern void _ZN7G17x5y5D1Ev();
Name_Map name_map_G17x5y5[] = {
  NSPAIR(_ZN7G17x5y5C1Ev),
  NSPAIR(_ZN7G17x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y5[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G17x5y5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y5[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y5[] = {
  {&(_ZTV7G17x5y5[4]),  4,11},
  {&(_ZTV7G17x5y5[7]),  7,11},
  {&(_ZTV7G17x5y5[10]),  10,11},
  {&(_tg__ZTV5E17x5__7G17x5y5[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x5y5[];
extern  VTBL_ENTRY _ZTV7G17x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y5[];
Class_Descriptor cd_G17x5y5 = {  "G17x5y5", // class name
  bases_G17x5y5, 6,
  &(vtc_G17x5y5[0]), // expected_vtbl_contents
  &(vtt_G17x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y6  : E17x5 , virtual F0 {
  int ff;
  ~G17x5y6(); // tgen
  G17x5y6(); // tgen
};
//SIG(1 G17x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x5y6 ::~G17x5y6(){ note_dtor("G17x5y6", this);} // tgen
G17x5y6 ::G17x5y6(){ note_ctor("G17x5y6", this);} // tgen

static void Test_G17x5y6()
{
  extern Class_Descriptor cd_G17x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x5y6, buf);
    G17x5y6 *dp, &lv = *(dp=new (buf) G17x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y6)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,16), "G17x5y6");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,24), "G17x5y6");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(24,16), "G17x5y6");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(8,4), "G17x5y6");
    check_base_class_offset(lv, (E17x5*), 0, "G17x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G17x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G17x5y6.ff");
    test_class_info(&lv, &cd_G17x5y6);
    dp->~G17x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y6(Test_G17x5y6, "G17x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x5y6C1Ev();
extern void _ZN7G17x5y6D1Ev();
Name_Map name_map_G17x5y6[] = {
  NSPAIR(_ZN7G17x5y6C1Ev),
  NSPAIR(_ZN7G17x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y6[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G17x5y6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y6[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y6[] = {
  {&(_ZTV7G17x5y6[4]),  4,8},
  {&(_tg__ZTV5E17x5__7G17x5y6[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y6[3]),  3,4},
  {&(_ZTV7G17x5y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G17x5y6[];
extern  VTBL_ENTRY _ZTV7G17x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y6[];
Class_Descriptor cd_G17x5y6 = {  "G17x5y6", // class name
  bases_G17x5y6, 6,
  &(vtc_G17x5y6[0]), // expected_vtbl_contents
  &(vtt_G17x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x5y7  : virtual E17x5 , virtual F0 {
  int ff;
  ~G17x5y7(); // tgen
  G17x5y7(); // tgen
};
//SIG(1 G17x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x5y7 ::~G17x5y7(){ note_dtor("G17x5y7", this);} // tgen
G17x5y7 ::G17x5y7(){ note_ctor("G17x5y7", this);} // tgen

static void Test_G17x5y7()
{
  extern Class_Descriptor cd_G17x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x5y7, buf);
    G17x5y7 *dp, &lv = *(dp=new (buf) G17x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x5y7)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x5y7");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x5y7");
    check_base_class_offset(lv, (C17*)(E17x5*), ABISELECT(32,20), "G17x5y7");
    check_base_class_offset(lv, (D0*)(E17x5*), ABISELECT(24,12), "G17x5y7");
    check_base_class_offset(lv, (E17x5*), ABISELECT(16,8), "G17x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G17x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x5y7.ff");
    test_class_info(&lv, &cd_G17x5y7);
    dp->~G17x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x5y7(Test_G17x5y7, "G17x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x5y7C1Ev();
extern void _ZN7G17x5y7D1Ev();
Name_Map name_map_G17x5y7[] = {
  NSPAIR(_ZN7G17x5y7C1Ev),
  NSPAIR(_ZN7G17x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x5;
extern VTBL_ENTRY _ZTI5E17x5[];
extern  VTBL_ENTRY _ZTV5E17x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E17x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x5y7[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G17x5y7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x5y7[];
static  VTBL_ENTRY _tg__ZTV5E17x5__7G17x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x5__7G17x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x5y7[] = {
  {&(_ZTV7G17x5y7[5]),  5,12},
  {&(_ZTV7G17x5y7[8]),  8,12},
  {&(_ZTV7G17x5y7[11]),  11,12},
  {&(_tg__ZTV5E17x5__7G17x5y7[3]),  3,3},
  {&(_tg__ZTV3C17__5E17x5__7G17x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x5y7[];
extern  VTBL_ENTRY _ZTV7G17x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x5y7[];
Class_Descriptor cd_G17x5y7 = {  "G17x5y7", // class name
  bases_G17x5y7, 6,
  &(vtc_G17x5y7[0]), // expected_vtbl_contents
  &(vtt_G17x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x5y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x5y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E18x5  : virtual C18 , D0 {
  int fd;
  ~E18x5(); // tgen
  E18x5(); // tgen
};
//SIG(-1 E18x5) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E18x5 ::~E18x5(){ note_dtor("E18x5", this);} // tgen
E18x5 ::E18x5(){ note_ctor("E18x5", this);} // tgen

static void Test_E18x5()
{
  extern Class_Descriptor cd_E18x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E18x5, buf);
    E18x5 *dp, &lv = *(dp=new (buf) E18x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E18x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x5)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,24), "E18x5");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,16), "E18x5");
    check_base_class_offset(lv, (C18*), ABISELECT(16,12), "E18x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E18x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E18x5.fd");
    test_class_info(&lv, &cd_E18x5);
    dp->~E18x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x5(Test_E18x5, "E18x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E18x5C1Ev();
extern void _ZN5E18x5D1Ev();
Name_Map name_map_E18x5[] = {
  NSPAIR(_ZN5E18x5C1Ev),
  NSPAIR(_ZN5E18x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E18x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E18x5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_E18x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV5E18x5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x5[] = {
  {&(_ZTV5E18x5[4]),  4,9},
  {&(_ZTV5E18x5[8]),  8,9},
  {&(_tg__ZTV3C18__5E18x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
Class_Descriptor cd_E18x5 = {  "E18x5", // class name
  bases_E18x5, 4,
  &(vtc_E18x5[0]), // expected_vtbl_contents
  &(vtt_E18x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E18x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E18x5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E18x5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y0  : E18x5 , F1 {
  int ff;
  ~G18x5y0(); // tgen
  G18x5y0(); // tgen
};
//SIG(1 G18x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x5y0 ::~G18x5y0(){ note_dtor("G18x5y0", this);} // tgen
G18x5y0 ::G18x5y0(){ note_ctor("G18x5y0", this);} // tgen

static void Test_G18x5y0()
{
  extern Class_Descriptor cd_G18x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x5y0, buf);
    G18x5y0 *dp, &lv = *(dp=new (buf) G18x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y0)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,36), "G18x5y0");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,28), "G18x5y0");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(32,24), "G18x5y0");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(8,4), "G18x5y0");
    check_base_class_offset(lv, (E18x5*), 0, "G18x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G18x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G18x5y0.ff");
    test_class_info(&lv, &cd_G18x5y0);
    dp->~G18x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y0(Test_G18x5y0, "G18x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x5y0C1Ev();
extern void _ZN7G18x5y0D1Ev();
Name_Map name_map_G18x5y0[] = {
  NSPAIR(_ZN7G18x5y0C1Ev),
  NSPAIR(_ZN7G18x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G18x5y0[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y0[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y0[] = {
  {&(_ZTV7G18x5y0[4]),  4,12},
  {&(_tg__ZTV5E18x5__7G18x5y0[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y0[4]),  4,5},
  {&(_ZTV7G18x5y0[11]),  11,12},
  {&(_tg__ZTV3C18__7G18x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y0[];
extern  VTBL_ENTRY _ZTV7G18x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y0[];
Class_Descriptor cd_G18x5y0 = {  "G18x5y0", // class name
  bases_G18x5y0, 6,
  &(vtc_G18x5y0[0]), // expected_vtbl_contents
  &(vtt_G18x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y1  : virtual E18x5 , F1 {
  int ff;
  ~G18x5y1(); // tgen
  G18x5y1(); // tgen
};
//SIG(1 G18x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x5y1 ::~G18x5y1(){ note_dtor("G18x5y1", this);} // tgen
G18x5y1 ::G18x5y1(){ note_ctor("G18x5y1", this);} // tgen

static void Test_G18x5y1()
{
  extern Class_Descriptor cd_G18x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x5y1, buf);
    G18x5y1 *dp, &lv = *(dp=new (buf) G18x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y1)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,36), "G18x5y1");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,28), "G18x5y1");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(32,24), "G18x5y1");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(24,16), "G18x5y1");
    check_base_class_offset(lv, (E18x5*), ABISELECT(16,12), "G18x5y1");
    check_base_class_offset(lv, (F1*), 0, "G18x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x5y1.ff");
    test_class_info(&lv, &cd_G18x5y1);
    dp->~G18x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y1(Test_G18x5y1, "G18x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x5y1C1Ev();
extern void _ZN7G18x5y1D1Ev();
Name_Map name_map_G18x5y1[] = {
  NSPAIR(_ZN7G18x5y1C1Ev),
  NSPAIR(_ZN7G18x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G18x5y1[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y1[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y1[] = {
  {&(_ZTV7G18x5y1[5]),  5,15},
  {&(_ZTV7G18x5y1[10]),  10,15},
  {&(_ZTV7G18x5y1[14]),  14,15},
  {&(_tg__ZTV5E18x5__7G18x5y1[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y1[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y1[];
extern  VTBL_ENTRY _ZTV7G18x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y1[];
Class_Descriptor cd_G18x5y1 = {  "G18x5y1", // class name
  bases_G18x5y1, 6,
  &(vtc_G18x5y1[0]), // expected_vtbl_contents
  &(vtt_G18x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y2  : E18x5 , virtual F1 {
  int ff;
  ~G18x5y2(); // tgen
  G18x5y2(); // tgen
};
//SIG(1 G18x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x5y2 ::~G18x5y2(){ note_dtor("G18x5y2", this);} // tgen
G18x5y2 ::G18x5y2(){ note_ctor("G18x5y2", this);} // tgen

static void Test_G18x5y2()
{
  extern Class_Descriptor cd_G18x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x5y2, buf);
    G18x5y2 *dp, &lv = *(dp=new (buf) G18x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y2)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,28), "G18x5y2");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,20), "G18x5y2");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(24,16), "G18x5y2");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(8,4), "G18x5y2");
    check_base_class_offset(lv, (E18x5*), 0, "G18x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G18x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G18x5y2.ff");
    test_class_info(&lv, &cd_G18x5y2);
    dp->~G18x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y2(Test_G18x5y2, "G18x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G18x5y2C1Ev();
extern void _ZN7G18x5y2D1Ev();
Name_Map name_map_G18x5y2[] = {
  NSPAIR(_ZN7G18x5y2C1Ev),
  NSPAIR(_ZN7G18x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y2[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G18x5y2[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G18x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y2[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y2[] = {
  {&(_ZTV7G18x5y2[5]),  5,14},
  {&(_tg__ZTV5E18x5__7G18x5y2[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y2[4]),  4,5},
  {&(_ZTV7G18x5y2[9]),  9,14},
  {&(_ZTV7G18x5y2[13]),  13,14},
  {&(_tg__ZTV3C18__7G18x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y2[];
extern  VTBL_ENTRY _ZTV7G18x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y2[];
Class_Descriptor cd_G18x5y2 = {  "G18x5y2", // class name
  bases_G18x5y2, 6,
  &(vtc_G18x5y2[0]), // expected_vtbl_contents
  &(vtt_G18x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G18x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y3  : virtual E18x5 , virtual F1 {
  int ff;
  ~G18x5y3(); // tgen
  G18x5y3(); // tgen
};
//SIG(1 G18x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x5y3 ::~G18x5y3(){ note_dtor("G18x5y3", this);} // tgen
G18x5y3 ::G18x5y3(){ note_ctor("G18x5y3", this);} // tgen

static void Test_G18x5y3()
{
  extern Class_Descriptor cd_G18x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G18x5y3, buf);
    G18x5y3 *dp, &lv = *(dp=new (buf) G18x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G18x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y3)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x5y3");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x5y3");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(32,20), "G18x5y3");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(24,12), "G18x5y3");
    check_base_class_offset(lv, (E18x5*), ABISELECT(16,8), "G18x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G18x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x5y3.ff");
    test_class_info(&lv, &cd_G18x5y3);
    dp->~G18x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y3(Test_G18x5y3, "G18x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G18x5y3C1Ev();
extern void _ZN7G18x5y3D1Ev();
Name_Map name_map_G18x5y3[] = {
  NSPAIR(_ZN7G18x5y3C1Ev),
  NSPAIR(_ZN7G18x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y3[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G18x5y3[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G18x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y3[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y3[] = {
  {&(_ZTV7G18x5y3[6]),  6,19},
  {&(_ZTV7G18x5y3[10]),  10,19},
  {&(_ZTV7G18x5y3[14]),  14,19},
  {&(_ZTV7G18x5y3[18]),  18,19},
  {&(_tg__ZTV5E18x5__7G18x5y3[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y3[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y3[];
extern  VTBL_ENTRY _ZTV7G18x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y3[];
Class_Descriptor cd_G18x5y3 = {  "G18x5y3", // class name
  bases_G18x5y3, 6,
  &(vtc_G18x5y3[0]), // expected_vtbl_contents
  &(vtt_G18x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G18x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y4  : E18x5 , F0 {
  int ff;
  ~G18x5y4(); // tgen
  G18x5y4(); // tgen
};
//SIG(1 G18x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G18x5y4 ::~G18x5y4(){ note_dtor("G18x5y4", this);} // tgen
G18x5y4 ::G18x5y4(){ note_ctor("G18x5y4", this);} // tgen

static void Test_G18x5y4()
{
  extern Class_Descriptor cd_G18x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x5y4, buf);
    G18x5y4 *dp, &lv = *(dp=new (buf) G18x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y4)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,32), "G18x5y4");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,24), "G18x5y4");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(24,20), "G18x5y4");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(8,4), "G18x5y4");
    check_base_class_offset(lv, (E18x5*), 0, "G18x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G18x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G18x5y4.ff");
    test_class_info(&lv, &cd_G18x5y4);
    dp->~G18x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y4(Test_G18x5y4, "G18x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x5y4C1Ev();
extern void _ZN7G18x5y4D1Ev();
Name_Map name_map_G18x5y4[] = {
  NSPAIR(_ZN7G18x5y4C1Ev),
  NSPAIR(_ZN7G18x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G18x5y4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y4[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y4[] = {
  {&(_ZTV7G18x5y4[4]),  4,9},
  {&(_tg__ZTV5E18x5__7G18x5y4[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y4[4]),  4,5},
  {&(_ZTV7G18x5y4[8]),  8,9},
  {&(_tg__ZTV3C18__7G18x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y4[];
extern  VTBL_ENTRY _ZTV7G18x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y4[];
Class_Descriptor cd_G18x5y4 = {  "G18x5y4", // class name
  bases_G18x5y4, 6,
  &(vtc_G18x5y4[0]), // expected_vtbl_contents
  &(vtt_G18x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y5  : virtual E18x5 , F0 {
  int ff;
  ~G18x5y5(); // tgen
  G18x5y5(); // tgen
};
//SIG(1 G18x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G18x5y5 ::~G18x5y5(){ note_dtor("G18x5y5", this);} // tgen
G18x5y5 ::G18x5y5(){ note_ctor("G18x5y5", this);} // tgen

static void Test_G18x5y5()
{
  extern Class_Descriptor cd_G18x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x5y5, buf);
    G18x5y5 *dp, &lv = *(dp=new (buf) G18x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y5)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,36), "G18x5y5");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,28), "G18x5y5");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(32,24), "G18x5y5");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(24,16), "G18x5y5");
    check_base_class_offset(lv, (E18x5*), ABISELECT(16,12), "G18x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x5y5.ff");
    test_class_info(&lv, &cd_G18x5y5);
    dp->~G18x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y5(Test_G18x5y5, "G18x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x5y5C1Ev();
extern void _ZN7G18x5y5D1Ev();
Name_Map name_map_G18x5y5[] = {
  NSPAIR(_ZN7G18x5y5C1Ev),
  NSPAIR(_ZN7G18x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G18x5y5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y5[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y5[] = {
  {&(_ZTV7G18x5y5[5]),  5,14},
  {&(_ZTV7G18x5y5[9]),  9,14},
  {&(_ZTV7G18x5y5[13]),  13,14},
  {&(_tg__ZTV5E18x5__7G18x5y5[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y5[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y5[];
extern  VTBL_ENTRY _ZTV7G18x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y5[];
Class_Descriptor cd_G18x5y5 = {  "G18x5y5", // class name
  bases_G18x5y5, 6,
  &(vtc_G18x5y5[0]), // expected_vtbl_contents
  &(vtt_G18x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y6  : E18x5 , virtual F0 {
  int ff;
  ~G18x5y6(); // tgen
  G18x5y6(); // tgen
};
//SIG(1 G18x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x5y6 ::~G18x5y6(){ note_dtor("G18x5y6", this);} // tgen
G18x5y6 ::G18x5y6(){ note_ctor("G18x5y6", this);} // tgen

static void Test_G18x5y6()
{
  extern Class_Descriptor cd_G18x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x5y6, buf);
    G18x5y6 *dp, &lv = *(dp=new (buf) G18x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y6)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,28), "G18x5y6");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,20), "G18x5y6");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(24,16), "G18x5y6");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(8,4), "G18x5y6");
    check_base_class_offset(lv, (E18x5*), 0, "G18x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G18x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G18x5y6.ff");
    test_class_info(&lv, &cd_G18x5y6);
    dp->~G18x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y6(Test_G18x5y6, "G18x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x5y6C1Ev();
extern void _ZN7G18x5y6D1Ev();
Name_Map name_map_G18x5y6[] = {
  NSPAIR(_ZN7G18x5y6C1Ev),
  NSPAIR(_ZN7G18x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G18x5y6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y6[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y6[] = {
  {&(_ZTV7G18x5y6[5]),  5,10},
  {&(_tg__ZTV5E18x5__7G18x5y6[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y6[4]),  4,5},
  {&(_ZTV7G18x5y6[9]),  9,10},
  {&(_tg__ZTV3C18__7G18x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y6[];
extern  VTBL_ENTRY _ZTV7G18x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y6[];
Class_Descriptor cd_G18x5y6 = {  "G18x5y6", // class name
  bases_G18x5y6, 6,
  &(vtc_G18x5y6[0]), // expected_vtbl_contents
  &(vtt_G18x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x5y7  : virtual E18x5 , virtual F0 {
  int ff;
  ~G18x5y7(); // tgen
  G18x5y7(); // tgen
};
//SIG(1 G18x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x5y7 ::~G18x5y7(){ note_dtor("G18x5y7", this);} // tgen
G18x5y7 ::G18x5y7(){ note_ctor("G18x5y7", this);} // tgen

static void Test_G18x5y7()
{
  extern Class_Descriptor cd_G18x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x5y7, buf);
    G18x5y7 *dp, &lv = *(dp=new (buf) G18x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x5y7)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x5y7");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x5y7");
    check_base_class_offset(lv, (C18*)(E18x5*), ABISELECT(32,20), "G18x5y7");
    check_base_class_offset(lv, (D0*)(E18x5*), ABISELECT(24,12), "G18x5y7");
    check_base_class_offset(lv, (E18x5*), ABISELECT(16,8), "G18x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G18x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x5y7.ff");
    test_class_info(&lv, &cd_G18x5y7);
    dp->~G18x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x5y7(Test_G18x5y7, "G18x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x5y7C1Ev();
extern void _ZN7G18x5y7D1Ev();
Name_Map name_map_G18x5y7[] = {
  NSPAIR(_ZN7G18x5y7C1Ev),
  NSPAIR(_ZN7G18x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x5;
extern VTBL_ENTRY _ZTI5E18x5[];
extern  VTBL_ENTRY _ZTV5E18x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E18x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x5y7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G18x5y7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x5y7[];
static  VTBL_ENTRY _tg__ZTV5E18x5__7G18x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x5__7G18x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x5y7[] = {
  {&(_ZTV7G18x5y7[6]),  6,15},
  {&(_ZTV7G18x5y7[10]),  10,15},
  {&(_ZTV7G18x5y7[14]),  14,15},
  {&(_tg__ZTV5E18x5__7G18x5y7[4]),  4,4},
  {&(_tg__ZTV3C18__5E18x5__7G18x5y7[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x5y7[];
extern  VTBL_ENTRY _ZTV7G18x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x5y7[];
Class_Descriptor cd_G18x5y7 = {  "G18x5y7", // class name
  bases_G18x5y7, 6,
  &(vtc_G18x5y7[0]), // expected_vtbl_contents
  &(vtt_G18x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x5y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x5y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E19x5  : virtual C19 , D0 {
  int fd;
  ~E19x5(); // tgen
  E19x5(); // tgen
};
//SIG(-1 E19x5) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E19x5 ::~E19x5(){ note_dtor("E19x5", this);} // tgen
E19x5 ::E19x5(){ note_ctor("E19x5", this);} // tgen

static void Test_E19x5()
{
  extern Class_Descriptor cd_E19x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E19x5, buf);
    E19x5 *dp, &lv = *(dp=new (buf) E19x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E19x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x5)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,24), "E19x5");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,16), "E19x5");
    check_base_class_offset(lv, (C19*), ABISELECT(16,12), "E19x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E19x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E19x5.fd");
    test_class_info(&lv, &cd_E19x5);
    dp->~E19x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x5(Test_E19x5, "E19x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E19x5C1Ev();
extern void _ZN5E19x5D1Ev();
Name_Map name_map_E19x5[] = {
  NSPAIR(_ZN5E19x5C1Ev),
  NSPAIR(_ZN5E19x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E19x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E19x5[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV5E19x5[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__5E19x5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x5[] = {
  {&(_ZTV5E19x5[4]),  4,13},
  {&(_ZTV5E19x5[8]),  8,13},
  {&(_ZTV5E19x5[12]),  12,13},
  {&(_tg__ZTV3C19__5E19x5[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__5E19x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
static VTBL_ENTRY alt_thunk_names71[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x5 = {  "E19x5", // class name
  bases_E19x5, 4,
  &(vtc_E19x5[0]), // expected_vtbl_contents
  &(vtt_E19x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E19x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E19x5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E19x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names71,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y0  : E19x5 , F1 {
  int ff;
  ~G19x5y0(); // tgen
  G19x5y0(); // tgen
};
//SIG(1 G19x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x5y0 ::~G19x5y0(){ note_dtor("G19x5y0", this);} // tgen
G19x5y0 ::G19x5y0(){ note_ctor("G19x5y0", this);} // tgen

static void Test_G19x5y0()
{
  extern Class_Descriptor cd_G19x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x5y0, buf);
    G19x5y0 *dp, &lv = *(dp=new (buf) G19x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y0)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,36), "G19x5y0");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,28), "G19x5y0");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(32,24), "G19x5y0");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(8,4), "G19x5y0");
    check_base_class_offset(lv, (E19x5*), 0, "G19x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G19x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G19x5y0.ff");
    test_class_info(&lv, &cd_G19x5y0);
    dp->~G19x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y0(Test_G19x5y0, "G19x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x5y0C1Ev();
extern void _ZN7G19x5y0D1Ev();
Name_Map name_map_G19x5y0[] = {
  NSPAIR(_ZN7G19x5y0C1Ev),
  NSPAIR(_ZN7G19x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x5y0[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G19x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x5y0[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y0[] = {
  {&(_ZTV7G19x5y0[4]),  4,16},
  {&(_tg__ZTV5E19x5__7G19x5y0[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y0[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y0[3]),  3,4},
  {&(_ZTV7G19x5y0[11]),  11,16},
  {&(_ZTV7G19x5y0[15]),  15,16},
  {&(_tg__ZTV3C19__7G19x5y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y0[];
extern  VTBL_ENTRY _ZTV7G19x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y0[];
static VTBL_ENTRY alt_thunk_names72[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y0 = {  "G19x5y0", // class name
  bases_G19x5y0, 6,
  &(vtc_G19x5y0[0]), // expected_vtbl_contents
  &(vtt_G19x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names72,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y1  : virtual E19x5 , F1 {
  int ff;
  ~G19x5y1(); // tgen
  G19x5y1(); // tgen
};
//SIG(1 G19x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x5y1 ::~G19x5y1(){ note_dtor("G19x5y1", this);} // tgen
G19x5y1 ::G19x5y1(){ note_ctor("G19x5y1", this);} // tgen

static void Test_G19x5y1()
{
  extern Class_Descriptor cd_G19x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x5y1, buf);
    G19x5y1 *dp, &lv = *(dp=new (buf) G19x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y1)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,36), "G19x5y1");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,28), "G19x5y1");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(32,24), "G19x5y1");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(24,16), "G19x5y1");
    check_base_class_offset(lv, (E19x5*), ABISELECT(16,12), "G19x5y1");
    check_base_class_offset(lv, (F1*), 0, "G19x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x5y1.ff");
    test_class_info(&lv, &cd_G19x5y1);
    dp->~G19x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y1(Test_G19x5y1, "G19x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x5y1C1Ev();
extern void _ZN7G19x5y1D1Ev();
Name_Map name_map_G19x5y1[] = {
  NSPAIR(_ZN7G19x5y1C1Ev),
  NSPAIR(_ZN7G19x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x5y1[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G19x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x5y1[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y1[] = {
  {&(_ZTV7G19x5y1[5]),  5,19},
  {&(_ZTV7G19x5y1[10]),  10,19},
  {&(_ZTV7G19x5y1[14]),  14,19},
  {&(_ZTV7G19x5y1[18]),  18,19},
  {&(_tg__ZTV5E19x5__7G19x5y1[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y1[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y1[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x5y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y1[];
extern  VTBL_ENTRY _ZTV7G19x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y1[];
static VTBL_ENTRY alt_thunk_names73[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y1 = {  "G19x5y1", // class name
  bases_G19x5y1, 6,
  &(vtc_G19x5y1[0]), // expected_vtbl_contents
  &(vtt_G19x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names73,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y2  : E19x5 , virtual F1 {
  int ff;
  ~G19x5y2(); // tgen
  G19x5y2(); // tgen
};
//SIG(1 G19x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x5y2 ::~G19x5y2(){ note_dtor("G19x5y2", this);} // tgen
G19x5y2 ::G19x5y2(){ note_ctor("G19x5y2", this);} // tgen

static void Test_G19x5y2()
{
  extern Class_Descriptor cd_G19x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x5y2, buf);
    G19x5y2 *dp, &lv = *(dp=new (buf) G19x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y2)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,28), "G19x5y2");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,20), "G19x5y2");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(24,16), "G19x5y2");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(8,4), "G19x5y2");
    check_base_class_offset(lv, (E19x5*), 0, "G19x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G19x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G19x5y2.ff");
    test_class_info(&lv, &cd_G19x5y2);
    dp->~G19x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y2(Test_G19x5y2, "G19x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G19x5y2C1Ev();
extern void _ZN7G19x5y2D1Ev();
Name_Map name_map_G19x5y2[] = {
  NSPAIR(_ZN7G19x5y2C1Ev),
  NSPAIR(_ZN7G19x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y2[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G19x5y2[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G19x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x5y2[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y2[] = {
  {&(_ZTV7G19x5y2[5]),  5,18},
  {&(_tg__ZTV5E19x5__7G19x5y2[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y2[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y2[3]),  3,4},
  {&(_ZTV7G19x5y2[9]),  9,18},
  {&(_ZTV7G19x5y2[13]),  13,18},
  {&(_ZTV7G19x5y2[17]),  17,18},
  {&(_tg__ZTV3C19__7G19x5y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y2[];
extern  VTBL_ENTRY _ZTV7G19x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y2[];
static VTBL_ENTRY alt_thunk_names74[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y2 = {  "G19x5y2", // class name
  bases_G19x5y2, 6,
  &(vtc_G19x5y2[0]), // expected_vtbl_contents
  &(vtt_G19x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G19x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names74,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y3  : virtual E19x5 , virtual F1 {
  int ff;
  ~G19x5y3(); // tgen
  G19x5y3(); // tgen
};
//SIG(1 G19x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x5y3 ::~G19x5y3(){ note_dtor("G19x5y3", this);} // tgen
G19x5y3 ::G19x5y3(){ note_ctor("G19x5y3", this);} // tgen

static void Test_G19x5y3()
{
  extern Class_Descriptor cd_G19x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G19x5y3, buf);
    G19x5y3 *dp, &lv = *(dp=new (buf) G19x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G19x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y3)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x5y3");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x5y3");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(32,20), "G19x5y3");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(24,12), "G19x5y3");
    check_base_class_offset(lv, (E19x5*), ABISELECT(16,8), "G19x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G19x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x5y3.ff");
    test_class_info(&lv, &cd_G19x5y3);
    dp->~G19x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y3(Test_G19x5y3, "G19x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G19x5y3C1Ev();
extern void _ZN7G19x5y3D1Ev();
Name_Map name_map_G19x5y3[] = {
  NSPAIR(_ZN7G19x5y3C1Ev),
  NSPAIR(_ZN7G19x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y3[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G19x5y3[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G19x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G19x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x5y3[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y3[] = {
  {&(_ZTV7G19x5y3[6]),  6,23},
  {&(_ZTV7G19x5y3[10]),  10,23},
  {&(_ZTV7G19x5y3[14]),  14,23},
  {&(_ZTV7G19x5y3[18]),  18,23},
  {&(_ZTV7G19x5y3[22]),  22,23},
  {&(_tg__ZTV5E19x5__7G19x5y3[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y3[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y3[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x5y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y3[];
extern  VTBL_ENTRY _ZTV7G19x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y3[];
static VTBL_ENTRY alt_thunk_names75[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y3 = {  "G19x5y3", // class name
  bases_G19x5y3, 6,
  &(vtc_G19x5y3[0]), // expected_vtbl_contents
  &(vtt_G19x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G19x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names75,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y4  : E19x5 , F0 {
  int ff;
  ~G19x5y4(); // tgen
  G19x5y4(); // tgen
};
//SIG(1 G19x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G19x5y4 ::~G19x5y4(){ note_dtor("G19x5y4", this);} // tgen
G19x5y4 ::G19x5y4(){ note_ctor("G19x5y4", this);} // tgen

static void Test_G19x5y4()
{
  extern Class_Descriptor cd_G19x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x5y4, buf);
    G19x5y4 *dp, &lv = *(dp=new (buf) G19x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y4)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,32), "G19x5y4");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,24), "G19x5y4");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(24,20), "G19x5y4");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(8,4), "G19x5y4");
    check_base_class_offset(lv, (E19x5*), 0, "G19x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G19x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G19x5y4.ff");
    test_class_info(&lv, &cd_G19x5y4);
    dp->~G19x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y4(Test_G19x5y4, "G19x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x5y4C1Ev();
extern void _ZN7G19x5y4D1Ev();
Name_Map name_map_G19x5y4[] = {
  NSPAIR(_ZN7G19x5y4C1Ev),
  NSPAIR(_ZN7G19x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y4[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G19x5y4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G19x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x5y4[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y4[] = {
  {&(_ZTV7G19x5y4[4]),  4,13},
  {&(_tg__ZTV5E19x5__7G19x5y4[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y4[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y4[3]),  3,4},
  {&(_ZTV7G19x5y4[8]),  8,13},
  {&(_ZTV7G19x5y4[12]),  12,13},
  {&(_tg__ZTV3C19__7G19x5y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y4[];
extern  VTBL_ENTRY _ZTV7G19x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y4[];
static VTBL_ENTRY alt_thunk_names76[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y4 = {  "G19x5y4", // class name
  bases_G19x5y4, 6,
  &(vtc_G19x5y4[0]), // expected_vtbl_contents
  &(vtt_G19x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names76,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y5  : virtual E19x5 , F0 {
  int ff;
  ~G19x5y5(); // tgen
  G19x5y5(); // tgen
};
//SIG(1 G19x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G19x5y5 ::~G19x5y5(){ note_dtor("G19x5y5", this);} // tgen
G19x5y5 ::G19x5y5(){ note_ctor("G19x5y5", this);} // tgen

static void Test_G19x5y5()
{
  extern Class_Descriptor cd_G19x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x5y5, buf);
    G19x5y5 *dp, &lv = *(dp=new (buf) G19x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y5)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,36), "G19x5y5");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,28), "G19x5y5");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(32,24), "G19x5y5");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(24,16), "G19x5y5");
    check_base_class_offset(lv, (E19x5*), ABISELECT(16,12), "G19x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x5y5.ff");
    test_class_info(&lv, &cd_G19x5y5);
    dp->~G19x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y5(Test_G19x5y5, "G19x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x5y5C1Ev();
extern void _ZN7G19x5y5D1Ev();
Name_Map name_map_G19x5y5[] = {
  NSPAIR(_ZN7G19x5y5C1Ev),
  NSPAIR(_ZN7G19x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y5[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x5y5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G19x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x5y5[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y5[] = {
  {&(_ZTV7G19x5y5[5]),  5,18},
  {&(_ZTV7G19x5y5[9]),  9,18},
  {&(_ZTV7G19x5y5[13]),  13,18},
  {&(_ZTV7G19x5y5[17]),  17,18},
  {&(_tg__ZTV5E19x5__7G19x5y5[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y5[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y5[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x5y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y5[];
extern  VTBL_ENTRY _ZTV7G19x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y5[];
static VTBL_ENTRY alt_thunk_names77[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y5 = {  "G19x5y5", // class name
  bases_G19x5y5, 6,
  &(vtc_G19x5y5[0]), // expected_vtbl_contents
  &(vtt_G19x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names77,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y6  : E19x5 , virtual F0 {
  int ff;
  ~G19x5y6(); // tgen
  G19x5y6(); // tgen
};
//SIG(1 G19x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x5y6 ::~G19x5y6(){ note_dtor("G19x5y6", this);} // tgen
G19x5y6 ::G19x5y6(){ note_ctor("G19x5y6", this);} // tgen

static void Test_G19x5y6()
{
  extern Class_Descriptor cd_G19x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x5y6, buf);
    G19x5y6 *dp, &lv = *(dp=new (buf) G19x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y6)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,28), "G19x5y6");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,20), "G19x5y6");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(24,16), "G19x5y6");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(8,4), "G19x5y6");
    check_base_class_offset(lv, (E19x5*), 0, "G19x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G19x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G19x5y6.ff");
    test_class_info(&lv, &cd_G19x5y6);
    dp->~G19x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y6(Test_G19x5y6, "G19x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x5y6C1Ev();
extern void _ZN7G19x5y6D1Ev();
Name_Map name_map_G19x5y6[] = {
  NSPAIR(_ZN7G19x5y6C1Ev),
  NSPAIR(_ZN7G19x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y6[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G19x5y6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x5y6[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y6[] = {
  {&(_ZTV7G19x5y6[5]),  5,14},
  {&(_tg__ZTV5E19x5__7G19x5y6[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y6[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y6[3]),  3,4},
  {&(_ZTV7G19x5y6[9]),  9,14},
  {&(_ZTV7G19x5y6[13]),  13,14},
  {&(_tg__ZTV3C19__7G19x5y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y6[];
extern  VTBL_ENTRY _ZTV7G19x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y6[];
static VTBL_ENTRY alt_thunk_names78[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y6 = {  "G19x5y6", // class name
  bases_G19x5y6, 6,
  &(vtc_G19x5y6[0]), // expected_vtbl_contents
  &(vtt_G19x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names78,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x5y7  : virtual E19x5 , virtual F0 {
  int ff;
  ~G19x5y7(); // tgen
  G19x5y7(); // tgen
};
//SIG(1 G19x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x5y7 ::~G19x5y7(){ note_dtor("G19x5y7", this);} // tgen
G19x5y7 ::G19x5y7(){ note_ctor("G19x5y7", this);} // tgen

static void Test_G19x5y7()
{
  extern Class_Descriptor cd_G19x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x5y7, buf);
    G19x5y7 *dp, &lv = *(dp=new (buf) G19x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x5y7)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x5y7");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x5y7");
    check_base_class_offset(lv, (C19*)(E19x5*), ABISELECT(32,20), "G19x5y7");
    check_base_class_offset(lv, (D0*)(E19x5*), ABISELECT(24,12), "G19x5y7");
    check_base_class_offset(lv, (E19x5*), ABISELECT(16,8), "G19x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G19x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x5y7.ff");
    test_class_info(&lv, &cd_G19x5y7);
    dp->~G19x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x5y7(Test_G19x5y7, "G19x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x5y7C1Ev();
extern void _ZN7G19x5y7D1Ev();
Name_Map name_map_G19x5y7[] = {
  NSPAIR(_ZN7G19x5y7C1Ev),
  NSPAIR(_ZN7G19x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x5;
extern VTBL_ENTRY _ZTI5E19x5[];
extern  VTBL_ENTRY _ZTV5E19x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E19x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x5y7[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G19x5y7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G19x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x5y7[];
static  VTBL_ENTRY _tg__ZTV5E19x5__7G19x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x5__7G19x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x5__7G19x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x5y7[] = {
  {&(_ZTV7G19x5y7[6]),  6,19},
  {&(_ZTV7G19x5y7[10]),  10,19},
  {&(_ZTV7G19x5y7[14]),  14,19},
  {&(_ZTV7G19x5y7[18]),  18,19},
  {&(_tg__ZTV5E19x5__7G19x5y7[4]),  4,4},
  {&(_tg__ZTV3C19__5E19x5__7G19x5y7[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x5__7G19x5y7[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x5y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x5y7[];
extern  VTBL_ENTRY _ZTV7G19x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x5y7[];
static VTBL_ENTRY alt_thunk_names79[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x5y7 = {  "G19x5y7", // class name
  bases_G19x5y7, 6,
  &(vtc_G19x5y7[0]), // expected_vtbl_contents
  &(vtt_G19x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x5y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names79,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x5  : virtual C20 , D0 {
  int fd;
  ~E20x5(); // tgen
  E20x5(); // tgen
};
//SIG(-1 E20x5) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E20x5 ::~E20x5(){ note_dtor("E20x5", this);} // tgen
E20x5 ::E20x5(){ note_ctor("E20x5", this);} // tgen

static void Test_E20x5()
{
  extern Class_Descriptor cd_E20x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E20x5, buf);
    E20x5 *dp, &lv = *(dp=new (buf) E20x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E20x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x5)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,20), "E20x5");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,12), "E20x5");
    check_base_class_offset(lv, (C20*), ABISELECT(16,12), "E20x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E20x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E20x5.fd");
    test_class_info(&lv, &cd_E20x5);
    dp->~E20x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x5(Test_E20x5, "E20x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E20x5C1Ev();
extern void _ZN5E20x5D1Ev();
Name_Map name_map_E20x5[] = {
  NSPAIR(_ZN5E20x5C1Ev),
  NSPAIR(_ZN5E20x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E20x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E20x5[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_E20x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV5E20x5[];
static  VTT_ENTRY vtt_E20x5[] = {
  {&(_ZTV5E20x5[3]),  3,7},
  {&(_ZTV5E20x5[6]),  6,7},
};
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
Class_Descriptor cd_E20x5 = {  "E20x5", // class name
  bases_E20x5, 4,
  &(vtc_E20x5[0]), // expected_vtbl_contents
  &(vtt_E20x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E20x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E20x5),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E20x5),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y0  : E20x5 , F1 {
  int ff;
  ~G20x5y0(); // tgen
  G20x5y0(); // tgen
};
//SIG(1 G20x5y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x5y0 ::~G20x5y0(){ note_dtor("G20x5y0", this);} // tgen
G20x5y0 ::G20x5y0(){ note_ctor("G20x5y0", this);} // tgen

static void Test_G20x5y0()
{
  extern Class_Descriptor cd_G20x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x5y0, buf);
    G20x5y0 *dp, &lv = *(dp=new (buf) G20x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y0)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,32), "G20x5y0");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,24), "G20x5y0");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(32,24), "G20x5y0");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(8,4), "G20x5y0");
    check_base_class_offset(lv, (E20x5*), 0, "G20x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G20x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G20x5y0.ff");
    test_class_info(&lv, &cd_G20x5y0);
    dp->~G20x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y0(Test_G20x5y0, "G20x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x5y0C1Ev();
extern void _ZN7G20x5y0D1Ev();
Name_Map name_map_G20x5y0[] = {
  NSPAIR(_ZN7G20x5y0C1Ev),
  NSPAIR(_ZN7G20x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G20x5y0[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y0[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y0[] = {
  {&(_ZTV7G20x5y0[3]),  3,10},
  {&(_tg__ZTV5E20x5__7G20x5y0[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y0[3]),  3,4},
  {&(_ZTV7G20x5y0[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G20x5y0[];
extern  VTBL_ENTRY _ZTV7G20x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y0[];
Class_Descriptor cd_G20x5y0 = {  "G20x5y0", // class name
  bases_G20x5y0, 6,
  &(vtc_G20x5y0[0]), // expected_vtbl_contents
  &(vtt_G20x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y1  : virtual E20x5 , F1 {
  int ff;
  ~G20x5y1(); // tgen
  G20x5y1(); // tgen
};
//SIG(1 G20x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x5y1 ::~G20x5y1(){ note_dtor("G20x5y1", this);} // tgen
G20x5y1 ::G20x5y1(){ note_ctor("G20x5y1", this);} // tgen

static void Test_G20x5y1()
{
  extern Class_Descriptor cd_G20x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x5y1, buf);
    G20x5y1 *dp, &lv = *(dp=new (buf) G20x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y1)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,32), "G20x5y1");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,24), "G20x5y1");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(32,24), "G20x5y1");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(24,16), "G20x5y1");
    check_base_class_offset(lv, (E20x5*), ABISELECT(16,12), "G20x5y1");
    check_base_class_offset(lv, (F1*), 0, "G20x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x5y1.ff");
    test_class_info(&lv, &cd_G20x5y1);
    dp->~G20x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y1(Test_G20x5y1, "G20x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x5y1C1Ev();
extern void _ZN7G20x5y1D1Ev();
Name_Map name_map_G20x5y1[] = {
  NSPAIR(_ZN7G20x5y1C1Ev),
  NSPAIR(_ZN7G20x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G20x5y1[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y1[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y1[] = {
  {&(_ZTV7G20x5y1[4]),  4,12},
  {&(_ZTV7G20x5y1[8]),  8,12},
  {&(_ZTV7G20x5y1[11]),  11,12},
  {&(_tg__ZTV5E20x5__7G20x5y1[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x5y1[];
extern  VTBL_ENTRY _ZTV7G20x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y1[];
Class_Descriptor cd_G20x5y1 = {  "G20x5y1", // class name
  bases_G20x5y1, 6,
  &(vtc_G20x5y1[0]), // expected_vtbl_contents
  &(vtt_G20x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y1),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y2  : E20x5 , virtual F1 {
  int ff;
  ~G20x5y2(); // tgen
  G20x5y2(); // tgen
};
//SIG(1 G20x5y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x5y2 ::~G20x5y2(){ note_dtor("G20x5y2", this);} // tgen
G20x5y2 ::G20x5y2(){ note_ctor("G20x5y2", this);} // tgen

static void Test_G20x5y2()
{
  extern Class_Descriptor cd_G20x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x5y2, buf);
    G20x5y2 *dp, &lv = *(dp=new (buf) G20x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y2)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,24), "G20x5y2");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,16), "G20x5y2");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(24,16), "G20x5y2");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(8,4), "G20x5y2");
    check_base_class_offset(lv, (E20x5*), 0, "G20x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G20x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G20x5y2.ff");
    test_class_info(&lv, &cd_G20x5y2);
    dp->~G20x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y2(Test_G20x5y2, "G20x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G20x5y2C1Ev();
extern void _ZN7G20x5y2D1Ev();
Name_Map name_map_G20x5y2[] = {
  NSPAIR(_ZN7G20x5y2C1Ev),
  NSPAIR(_ZN7G20x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y2[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G20x5y2[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G20x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y2[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y2[] = {
  {&(_ZTV7G20x5y2[4]),  4,12},
  {&(_tg__ZTV5E20x5__7G20x5y2[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y2[3]),  3,4},
  {&(_ZTV7G20x5y2[7]),  7,12},
  {&(_ZTV7G20x5y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G20x5y2[];
extern  VTBL_ENTRY _ZTV7G20x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y2[];
Class_Descriptor cd_G20x5y2 = {  "G20x5y2", // class name
  bases_G20x5y2, 6,
  &(vtc_G20x5y2[0]), // expected_vtbl_contents
  &(vtt_G20x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G20x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y3  : virtual E20x5 , virtual F1 {
  int ff;
  ~G20x5y3(); // tgen
  G20x5y3(); // tgen
};
//SIG(1 G20x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x5y3 ::~G20x5y3(){ note_dtor("G20x5y3", this);} // tgen
G20x5y3 ::G20x5y3(){ note_ctor("G20x5y3", this);} // tgen

static void Test_G20x5y3()
{
  extern Class_Descriptor cd_G20x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G20x5y3, buf);
    G20x5y3 *dp, &lv = *(dp=new (buf) G20x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G20x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y3)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x5y3");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x5y3");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(32,20), "G20x5y3");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(24,12), "G20x5y3");
    check_base_class_offset(lv, (E20x5*), ABISELECT(16,8), "G20x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G20x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x5y3.ff");
    test_class_info(&lv, &cd_G20x5y3);
    dp->~G20x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y3(Test_G20x5y3, "G20x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G20x5y3C1Ev();
extern void _ZN7G20x5y3D1Ev();
Name_Map name_map_G20x5y3[] = {
  NSPAIR(_ZN7G20x5y3C1Ev),
  NSPAIR(_ZN7G20x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y3[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G20x5y3[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G20x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y3[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y3[] = {
  {&(_ZTV7G20x5y3[5]),  5,16},
  {&(_ZTV7G20x5y3[8]),  8,16},
  {&(_ZTV7G20x5y3[11]),  11,16},
  {&(_ZTV7G20x5y3[15]),  15,16},
  {&(_tg__ZTV5E20x5__7G20x5y3[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x5y3[];
extern  VTBL_ENTRY _ZTV7G20x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y3[];
Class_Descriptor cd_G20x5y3 = {  "G20x5y3", // class name
  bases_G20x5y3, 6,
  &(vtc_G20x5y3[0]), // expected_vtbl_contents
  &(vtt_G20x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G20x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y3),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y4  : E20x5 , F0 {
  int ff;
  ~G20x5y4(); // tgen
  G20x5y4(); // tgen
};
//SIG(1 G20x5y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G20x5y4 ::~G20x5y4(){ note_dtor("G20x5y4", this);} // tgen
G20x5y4 ::G20x5y4(){ note_ctor("G20x5y4", this);} // tgen

static void Test_G20x5y4()
{
  extern Class_Descriptor cd_G20x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x5y4, buf);
    G20x5y4 *dp, &lv = *(dp=new (buf) G20x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y4)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,28), "G20x5y4");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,20), "G20x5y4");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(24,20), "G20x5y4");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(8,4), "G20x5y4");
    check_base_class_offset(lv, (E20x5*), 0, "G20x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G20x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G20x5y4.ff");
    test_class_info(&lv, &cd_G20x5y4);
    dp->~G20x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y4(Test_G20x5y4, "G20x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x5y4C1Ev();
extern void _ZN7G20x5y4D1Ev();
Name_Map name_map_G20x5y4[] = {
  NSPAIR(_ZN7G20x5y4C1Ev),
  NSPAIR(_ZN7G20x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y4[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G20x5y4[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y4[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y4[] = {
  {&(_ZTV7G20x5y4[3]),  3,7},
  {&(_tg__ZTV5E20x5__7G20x5y4[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y4[3]),  3,4},
  {&(_ZTV7G20x5y4[6]),  6,7},
};
extern VTBL_ENTRY _ZTI7G20x5y4[];
extern  VTBL_ENTRY _ZTV7G20x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y4[];
Class_Descriptor cd_G20x5y4 = {  "G20x5y4", // class name
  bases_G20x5y4, 6,
  &(vtc_G20x5y4[0]), // expected_vtbl_contents
  &(vtt_G20x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y5  : virtual E20x5 , F0 {
  int ff;
  ~G20x5y5(); // tgen
  G20x5y5(); // tgen
};
//SIG(1 G20x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G20x5y5 ::~G20x5y5(){ note_dtor("G20x5y5", this);} // tgen
G20x5y5 ::G20x5y5(){ note_ctor("G20x5y5", this);} // tgen

static void Test_G20x5y5()
{
  extern Class_Descriptor cd_G20x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x5y5, buf);
    G20x5y5 *dp, &lv = *(dp=new (buf) G20x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y5)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,32), "G20x5y5");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,24), "G20x5y5");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(32,24), "G20x5y5");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(24,16), "G20x5y5");
    check_base_class_offset(lv, (E20x5*), ABISELECT(16,12), "G20x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x5y5.ff");
    test_class_info(&lv, &cd_G20x5y5);
    dp->~G20x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y5(Test_G20x5y5, "G20x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x5y5C1Ev();
extern void _ZN7G20x5y5D1Ev();
Name_Map name_map_G20x5y5[] = {
  NSPAIR(_ZN7G20x5y5C1Ev),
  NSPAIR(_ZN7G20x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y5[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G20x5y5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y5[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y5[] = {
  {&(_ZTV7G20x5y5[4]),  4,11},
  {&(_ZTV7G20x5y5[7]),  7,11},
  {&(_ZTV7G20x5y5[10]),  10,11},
  {&(_tg__ZTV5E20x5__7G20x5y5[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x5y5[];
extern  VTBL_ENTRY _ZTV7G20x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y5[];
Class_Descriptor cd_G20x5y5 = {  "G20x5y5", // class name
  bases_G20x5y5, 6,
  &(vtc_G20x5y5[0]), // expected_vtbl_contents
  &(vtt_G20x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y5),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y6  : E20x5 , virtual F0 {
  int ff;
  ~G20x5y6(); // tgen
  G20x5y6(); // tgen
};
//SIG(1 G20x5y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x5y6 ::~G20x5y6(){ note_dtor("G20x5y6", this);} // tgen
G20x5y6 ::G20x5y6(){ note_ctor("G20x5y6", this);} // tgen

static void Test_G20x5y6()
{
  extern Class_Descriptor cd_G20x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x5y6, buf);
    G20x5y6 *dp, &lv = *(dp=new (buf) G20x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y6)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,24), "G20x5y6");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,16), "G20x5y6");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(24,16), "G20x5y6");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(8,4), "G20x5y6");
    check_base_class_offset(lv, (E20x5*), 0, "G20x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G20x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G20x5y6.ff");
    test_class_info(&lv, &cd_G20x5y6);
    dp->~G20x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y6(Test_G20x5y6, "G20x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x5y6C1Ev();
extern void _ZN7G20x5y6D1Ev();
Name_Map name_map_G20x5y6[] = {
  NSPAIR(_ZN7G20x5y6C1Ev),
  NSPAIR(_ZN7G20x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y6[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G20x5y6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y6[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y6[] = {
  {&(_ZTV7G20x5y6[4]),  4,8},
  {&(_tg__ZTV5E20x5__7G20x5y6[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y6[3]),  3,4},
  {&(_ZTV7G20x5y6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G20x5y6[];
extern  VTBL_ENTRY _ZTV7G20x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y6[];
Class_Descriptor cd_G20x5y6 = {  "G20x5y6", // class name
  bases_G20x5y6, 6,
  &(vtc_G20x5y6[0]), // expected_vtbl_contents
  &(vtt_G20x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x5y7  : virtual E20x5 , virtual F0 {
  int ff;
  ~G20x5y7(); // tgen
  G20x5y7(); // tgen
};
//SIG(1 G20x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x5y7 ::~G20x5y7(){ note_dtor("G20x5y7", this);} // tgen
G20x5y7 ::G20x5y7(){ note_ctor("G20x5y7", this);} // tgen

static void Test_G20x5y7()
{
  extern Class_Descriptor cd_G20x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x5y7, buf);
    G20x5y7 *dp, &lv = *(dp=new (buf) G20x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x5y7)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x5y7");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x5y7");
    check_base_class_offset(lv, (C20*)(E20x5*), ABISELECT(32,20), "G20x5y7");
    check_base_class_offset(lv, (D0*)(E20x5*), ABISELECT(24,12), "G20x5y7");
    check_base_class_offset(lv, (E20x5*), ABISELECT(16,8), "G20x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G20x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x5y7.ff");
    test_class_info(&lv, &cd_G20x5y7);
    dp->~G20x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x5y7(Test_G20x5y7, "G20x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x5y7C1Ev();
extern void _ZN7G20x5y7D1Ev();
Name_Map name_map_G20x5y7[] = {
  NSPAIR(_ZN7G20x5y7C1Ev),
  NSPAIR(_ZN7G20x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x5;
extern VTBL_ENTRY _ZTI5E20x5[];
extern  VTBL_ENTRY _ZTV5E20x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E20x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x5y7[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G20x5y7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x5y7[];
static  VTBL_ENTRY _tg__ZTV5E20x5__7G20x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x5__7G20x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x5y7[] = {
  {&(_ZTV7G20x5y7[5]),  5,12},
  {&(_ZTV7G20x5y7[8]),  8,12},
  {&(_ZTV7G20x5y7[11]),  11,12},
  {&(_tg__ZTV5E20x5__7G20x5y7[3]),  3,3},
  {&(_tg__ZTV3C20__5E20x5__7G20x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x5y7[];
extern  VTBL_ENTRY _ZTV7G20x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x5y7[];
Class_Descriptor cd_G20x5y7 = {  "G20x5y7", // class name
  bases_G20x5y7, 6,
  &(vtc_G20x5y7[0]), // expected_vtbl_contents
  &(vtt_G20x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x5y7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x5y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E21x5  : virtual C21 , D0 {
  int fd;
  ~E21x5(); // tgen
  E21x5(); // tgen
};
//SIG(-1 E21x5) C1{ VBC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E21x5 ::~E21x5(){ note_dtor("E21x5", this);} // tgen
E21x5 ::E21x5(){ note_ctor("E21x5", this);} // tgen

static void Test_E21x5()
{
  extern Class_Descriptor cd_E21x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E21x5, buf);
    E21x5 *dp, &lv = *(dp=new (buf) E21x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E21x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x5)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,12), "E21x5");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,20), "E21x5");
    check_base_class_offset(lv, (C21*), ABISELECT(16,12), "E21x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E21x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E21x5.fd");
    test_class_info(&lv, &cd_E21x5);
    dp->~E21x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x5(Test_E21x5, "E21x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E21x5C1Ev();
extern void _ZN5E21x5D1Ev();
Name_Map name_map_E21x5[] = {
  NSPAIR(_ZN5E21x5C1Ev),
  NSPAIR(_ZN5E21x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E21x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E21x5[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_E21x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV5E21x5[];
static  VTT_ENTRY vtt_E21x5[] = {
  {&(_ZTV5E21x5[3]),  3,10},
  {&(_ZTV5E21x5[6]),  6,10},
  {&(_ZTV5E21x5[9]),  9,10},
};
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
Class_Descriptor cd_E21x5 = {  "E21x5", // class name
  bases_E21x5, 4,
  &(vtc_E21x5[0]), // expected_vtbl_contents
  &(vtt_E21x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E21x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E21x5),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E21x5),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y0  : E21x5 , F1 {
  int ff;
  ~G21x5y0(); // tgen
  G21x5y0(); // tgen
};
//SIG(1 G21x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x5y0 ::~G21x5y0(){ note_dtor("G21x5y0", this);} // tgen
G21x5y0 ::G21x5y0(){ note_ctor("G21x5y0", this);} // tgen

static void Test_G21x5y0()
{
  extern Class_Descriptor cd_G21x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G21x5y0, buf);
    G21x5y0 *dp, &lv = *(dp=new (buf) G21x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G21x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y0)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,24), "G21x5y0");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,32), "G21x5y0");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(32,24), "G21x5y0");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(8,4), "G21x5y0");
    check_base_class_offset(lv, (E21x5*), 0, "G21x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G21x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G21x5y0.ff");
    test_class_info(&lv, &cd_G21x5y0);
    dp->~G21x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y0(Test_G21x5y0, "G21x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G21x5y0C1Ev();
extern void _ZN7G21x5y0D1Ev();
Name_Map name_map_G21x5y0[] = {
  NSPAIR(_ZN7G21x5y0C1Ev),
  NSPAIR(_ZN7G21x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G21x5y0[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G21x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x5y0[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y0[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y0[] = {
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y0[] = {
  {&(_ZTV7G21x5y0[3]),  3,13},
  {&(_tg__ZTV5E21x5__7G21x5y0[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y0[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y0[2]),  2,3},
  {&(_ZTV7G21x5y0[9]),  9,13},
  {&(_ZTV7G21x5y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G21x5y0[];
extern  VTBL_ENTRY _ZTV7G21x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y0[];
Class_Descriptor cd_G21x5y0 = {  "G21x5y0", // class name
  bases_G21x5y0, 6,
  &(vtc_G21x5y0[0]), // expected_vtbl_contents
  &(vtt_G21x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G21x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y0),13, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y1  : virtual E21x5 , F1 {
  int ff;
  ~G21x5y1(); // tgen
  G21x5y1(); // tgen
};
//SIG(1 G21x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x5y1 ::~G21x5y1(){ note_dtor("G21x5y1", this);} // tgen
G21x5y1 ::G21x5y1(){ note_ctor("G21x5y1", this);} // tgen

static void Test_G21x5y1()
{
  extern Class_Descriptor cd_G21x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G21x5y1, buf);
    G21x5y1 *dp, &lv = *(dp=new (buf) G21x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G21x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y1)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,24), "G21x5y1");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,32), "G21x5y1");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(32,24), "G21x5y1");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(24,16), "G21x5y1");
    check_base_class_offset(lv, (E21x5*), ABISELECT(16,12), "G21x5y1");
    check_base_class_offset(lv, (F1*), 0, "G21x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x5y1.ff");
    test_class_info(&lv, &cd_G21x5y1);
    dp->~G21x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y1(Test_G21x5y1, "G21x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G21x5y1C1Ev();
extern void _ZN7G21x5y1D1Ev();
Name_Map name_map_G21x5y1[] = {
  NSPAIR(_ZN7G21x5y1C1Ev),
  NSPAIR(_ZN7G21x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x5y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G21x5y1[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G21x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x5y1[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y1[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y1[] = {
  {&(_ZTV7G21x5y1[4]),  4,15},
  {&(_ZTV7G21x5y1[8]),  8,15},
  {&(_ZTV7G21x5y1[11]),  11,15},
  {&(_ZTV7G21x5y1[14]),  14,15},
  {&(_tg__ZTV5E21x5__7G21x5y1[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y1[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x5y1[];
extern  VTBL_ENTRY _ZTV7G21x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y1[];
Class_Descriptor cd_G21x5y1 = {  "G21x5y1", // class name
  bases_G21x5y1, 6,
  &(vtc_G21x5y1[0]), // expected_vtbl_contents
  &(vtt_G21x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G21x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y1),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y2  : E21x5 , virtual F1 {
  int ff;
  ~G21x5y2(); // tgen
  G21x5y2(); // tgen
};
//SIG(1 G21x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x5y2 ::~G21x5y2(){ note_dtor("G21x5y2", this);} // tgen
G21x5y2 ::G21x5y2(){ note_ctor("G21x5y2", this);} // tgen

static void Test_G21x5y2()
{
  extern Class_Descriptor cd_G21x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x5y2, buf);
    G21x5y2 *dp, &lv = *(dp=new (buf) G21x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y2)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,16), "G21x5y2");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,24), "G21x5y2");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(24,16), "G21x5y2");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(8,4), "G21x5y2");
    check_base_class_offset(lv, (E21x5*), 0, "G21x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G21x5y2.ff");
    test_class_info(&lv, &cd_G21x5y2);
    dp->~G21x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y2(Test_G21x5y2, "G21x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x5y2C1Ev();
extern void _ZN7G21x5y2D1Ev();
Name_Map name_map_G21x5y2[] = {
  NSPAIR(_ZN7G21x5y2C1Ev),
  NSPAIR(_ZN7G21x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y2[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G21x5y2[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G21x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G21x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x5y2[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y2[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y2[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y2[] = {
  {&(_ZTV7G21x5y2[4]),  4,15},
  {&(_tg__ZTV5E21x5__7G21x5y2[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y2[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y2[2]),  2,3},
  {&(_ZTV7G21x5y2[7]),  7,15},
  {&(_ZTV7G21x5y2[10]),  10,15},
  {&(_ZTV7G21x5y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G21x5y2[];
extern  VTBL_ENTRY _ZTV7G21x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y2[];
Class_Descriptor cd_G21x5y2 = {  "G21x5y2", // class name
  bases_G21x5y2, 6,
  &(vtc_G21x5y2[0]), // expected_vtbl_contents
  &(vtt_G21x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y2),15, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y3  : virtual E21x5 , virtual F1 {
  int ff;
  ~G21x5y3(); // tgen
  G21x5y3(); // tgen
};
//SIG(1 G21x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x5y3 ::~G21x5y3(){ note_dtor("G21x5y3", this);} // tgen
G21x5y3 ::G21x5y3(){ note_ctor("G21x5y3", this);} // tgen

static void Test_G21x5y3()
{
  extern Class_Descriptor cd_G21x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G21x5y3, buf);
    G21x5y3 *dp, &lv = *(dp=new (buf) G21x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G21x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y3)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x5y3");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x5y3");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(32,20), "G21x5y3");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(24,12), "G21x5y3");
    check_base_class_offset(lv, (E21x5*), ABISELECT(16,8), "G21x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G21x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x5y3.ff");
    test_class_info(&lv, &cd_G21x5y3);
    dp->~G21x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y3(Test_G21x5y3, "G21x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G21x5y3C1Ev();
extern void _ZN7G21x5y3D1Ev();
Name_Map name_map_G21x5y3[] = {
  NSPAIR(_ZN7G21x5y3C1Ev),
  NSPAIR(_ZN7G21x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y3[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y3[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x5y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x5y3[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G21x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G21x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x5y3[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y3[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y3[] = {
  {&(_ZTV7G21x5y3[5]),  5,19},
  {&(_ZTV7G21x5y3[8]),  8,19},
  {&(_ZTV7G21x5y3[11]),  11,19},
  {&(_ZTV7G21x5y3[14]),  14,19},
  {&(_ZTV7G21x5y3[18]),  18,19},
  {&(_tg__ZTV5E21x5__7G21x5y3[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y3[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x5y3[];
extern  VTBL_ENTRY _ZTV7G21x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y3[];
Class_Descriptor cd_G21x5y3 = {  "G21x5y3", // class name
  bases_G21x5y3, 6,
  &(vtc_G21x5y3[0]), // expected_vtbl_contents
  &(vtt_G21x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G21x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y3),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y4  : E21x5 , F0 {
  int ff;
  ~G21x5y4(); // tgen
  G21x5y4(); // tgen
};
//SIG(1 G21x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G21x5y4 ::~G21x5y4(){ note_dtor("G21x5y4", this);} // tgen
G21x5y4 ::G21x5y4(){ note_ctor("G21x5y4", this);} // tgen

static void Test_G21x5y4()
{
  extern Class_Descriptor cd_G21x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x5y4, buf);
    G21x5y4 *dp, &lv = *(dp=new (buf) G21x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y4)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,20), "G21x5y4");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,28), "G21x5y4");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(24,20), "G21x5y4");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(8,4), "G21x5y4");
    check_base_class_offset(lv, (E21x5*), 0, "G21x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G21x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G21x5y4.ff");
    test_class_info(&lv, &cd_G21x5y4);
    dp->~G21x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y4(Test_G21x5y4, "G21x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x5y4C1Ev();
extern void _ZN7G21x5y4D1Ev();
Name_Map name_map_G21x5y4[] = {
  NSPAIR(_ZN7G21x5y4C1Ev),
  NSPAIR(_ZN7G21x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y4[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G21x5y4[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G21x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x5y4[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y4[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y4[] = {
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y4[] = {
  {&(_ZTV7G21x5y4[3]),  3,10},
  {&(_tg__ZTV5E21x5__7G21x5y4[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y4[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y4[2]),  2,3},
  {&(_ZTV7G21x5y4[6]),  6,10},
  {&(_ZTV7G21x5y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G21x5y4[];
extern  VTBL_ENTRY _ZTV7G21x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y4[];
Class_Descriptor cd_G21x5y4 = {  "G21x5y4", // class name
  bases_G21x5y4, 6,
  &(vtc_G21x5y4[0]), // expected_vtbl_contents
  &(vtt_G21x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y4),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y5  : virtual E21x5 , F0 {
  int ff;
  ~G21x5y5(); // tgen
  G21x5y5(); // tgen
};
//SIG(1 G21x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G21x5y5 ::~G21x5y5(){ note_dtor("G21x5y5", this);} // tgen
G21x5y5 ::G21x5y5(){ note_ctor("G21x5y5", this);} // tgen

static void Test_G21x5y5()
{
  extern Class_Descriptor cd_G21x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G21x5y5, buf);
    G21x5y5 *dp, &lv = *(dp=new (buf) G21x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G21x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y5)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,24), "G21x5y5");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,32), "G21x5y5");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(32,24), "G21x5y5");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(24,16), "G21x5y5");
    check_base_class_offset(lv, (E21x5*), ABISELECT(16,12), "G21x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x5y5.ff");
    test_class_info(&lv, &cd_G21x5y5);
    dp->~G21x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y5(Test_G21x5y5, "G21x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G21x5y5C1Ev();
extern void _ZN7G21x5y5D1Ev();
Name_Map name_map_G21x5y5[] = {
  NSPAIR(_ZN7G21x5y5C1Ev),
  NSPAIR(_ZN7G21x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y5[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y5[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x5y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G21x5y5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G21x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x5y5[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y5[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y5[] = {
  {&(_ZTV7G21x5y5[4]),  4,14},
  {&(_ZTV7G21x5y5[7]),  7,14},
  {&(_ZTV7G21x5y5[10]),  10,14},
  {&(_ZTV7G21x5y5[13]),  13,14},
  {&(_tg__ZTV5E21x5__7G21x5y5[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y5[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x5y5[];
extern  VTBL_ENTRY _ZTV7G21x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y5[];
Class_Descriptor cd_G21x5y5 = {  "G21x5y5", // class name
  bases_G21x5y5, 6,
  &(vtc_G21x5y5[0]), // expected_vtbl_contents
  &(vtt_G21x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G21x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y5),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y6  : E21x5 , virtual F0 {
  int ff;
  ~G21x5y6(); // tgen
  G21x5y6(); // tgen
};
//SIG(1 G21x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x5y6 ::~G21x5y6(){ note_dtor("G21x5y6", this);} // tgen
G21x5y6 ::G21x5y6(){ note_ctor("G21x5y6", this);} // tgen

static void Test_G21x5y6()
{
  extern Class_Descriptor cd_G21x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x5y6, buf);
    G21x5y6 *dp, &lv = *(dp=new (buf) G21x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y6)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,16), "G21x5y6");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,24), "G21x5y6");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(24,16), "G21x5y6");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(8,4), "G21x5y6");
    check_base_class_offset(lv, (E21x5*), 0, "G21x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G21x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G21x5y6.ff");
    test_class_info(&lv, &cd_G21x5y6);
    dp->~G21x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y6(Test_G21x5y6, "G21x5y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x5y6C1Ev();
extern void _ZN7G21x5y6D1Ev();
Name_Map name_map_G21x5y6[] = {
  NSPAIR(_ZN7G21x5y6C1Ev),
  NSPAIR(_ZN7G21x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y6[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x5y6[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G21x5y6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G21x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x5y6[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y6[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y6[] = {
  {&(_ZTV7G21x5y6[4]),  4,11},
  {&(_tg__ZTV5E21x5__7G21x5y6[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y6[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y6[2]),  2,3},
  {&(_ZTV7G21x5y6[7]),  7,11},
  {&(_ZTV7G21x5y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G21x5y6[];
extern  VTBL_ENTRY _ZTV7G21x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y6[];
Class_Descriptor cd_G21x5y6 = {  "G21x5y6", // class name
  bases_G21x5y6, 6,
  &(vtc_G21x5y6[0]), // expected_vtbl_contents
  &(vtt_G21x5y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y6),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x5y7  : virtual E21x5 , virtual F0 {
  int ff;
  ~G21x5y7(); // tgen
  G21x5y7(); // tgen
};
//SIG(1 G21x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x5y7 ::~G21x5y7(){ note_dtor("G21x5y7", this);} // tgen
G21x5y7 ::G21x5y7(){ note_ctor("G21x5y7", this);} // tgen

static void Test_G21x5y7()
{
  extern Class_Descriptor cd_G21x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x5y7, buf);
    G21x5y7 *dp, &lv = *(dp=new (buf) G21x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x5y7)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x5y7");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x5y7");
    check_base_class_offset(lv, (C21*)(E21x5*), ABISELECT(32,20), "G21x5y7");
    check_base_class_offset(lv, (D0*)(E21x5*), ABISELECT(24,12), "G21x5y7");
    check_base_class_offset(lv, (E21x5*), ABISELECT(16,8), "G21x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G21x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x5y7.ff");
    test_class_info(&lv, &cd_G21x5y7);
    dp->~G21x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x5y7(Test_G21x5y7, "G21x5y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x5y7C1Ev();
extern void _ZN7G21x5y7D1Ev();
Name_Map name_map_G21x5y7[] = {
  NSPAIR(_ZN7G21x5y7C1Ev),
  NSPAIR(_ZN7G21x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x5;
extern VTBL_ENTRY _ZTI5E21x5[];
extern  VTBL_ENTRY _ZTV5E21x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E21x5,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x5y7[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x5y7[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x5y7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x5y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x5y7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G21x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x5y7[];
static  VTBL_ENTRY _tg__ZTV5E21x5__7G21x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x5__7G21x5y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x5__7G21x5y7[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x5y7[] = {
  {&(_ZTV7G21x5y7[5]),  5,15},
  {&(_ZTV7G21x5y7[8]),  8,15},
  {&(_ZTV7G21x5y7[11]),  11,15},
  {&(_ZTV7G21x5y7[14]),  14,15},
  {&(_tg__ZTV5E21x5__7G21x5y7[3]),  3,3},
  {&(_tg__ZTV3C21__5E21x5__7G21x5y7[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x5__7G21x5y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x5y7[];
extern  VTBL_ENTRY _ZTV7G21x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x5y7[];
Class_Descriptor cd_G21x5y7 = {  "G21x5y7", // class name
  bases_G21x5y7, 6,
  &(vtc_G21x5y7[0]), // expected_vtbl_contents
  &(vtt_G21x5y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x5y7),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x5y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E22x5  : virtual C22 , D0 {
  int fd;
  ~E22x5(); // tgen
  E22x5(); // tgen
};
//SIG(-1 E22x5) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E22x5 ::~E22x5(){ note_dtor("E22x5", this);} // tgen
E22x5 ::E22x5(){ note_ctor("E22x5", this);} // tgen

static void Test_E22x5()
{
  extern Class_Descriptor cd_E22x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E22x5, buf);
    E22x5 *dp, &lv = *(dp=new (buf) E22x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E22x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x5)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,24), "E22x5");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,12), "E22x5");
    check_base_class_offset(lv, (C22*), ABISELECT(16,12), "E22x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E22x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E22x5.fd");
    test_class_info(&lv, &cd_E22x5);
    dp->~E22x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x5(Test_E22x5, "E22x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E22x5C1Ev();
extern void _ZN5E22x5D1Ev();
Name_Map name_map_E22x5[] = {
  NSPAIR(_ZN5E22x5C1Ev),
  NSPAIR(_ZN5E22x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E22x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E22x5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_E22x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV5E22x5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x5[] = {
  {&(_ZTV5E22x5[4]),  4,9},
  {&(_ZTV5E22x5[8]),  8,9},
  {&(_tg__ZTV3C22__5E22x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
Class_Descriptor cd_E22x5 = {  "E22x5", // class name
  bases_E22x5, 4,
  &(vtc_E22x5[0]), // expected_vtbl_contents
  &(vtt_E22x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E22x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E22x5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E22x5),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y0  : E22x5 , F1 {
  int ff;
  ~G22x5y0(); // tgen
  G22x5y0(); // tgen
};
//SIG(1 G22x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x5y0 ::~G22x5y0(){ note_dtor("G22x5y0", this);} // tgen
G22x5y0 ::G22x5y0(){ note_ctor("G22x5y0", this);} // tgen

static void Test_G22x5y0()
{
  extern Class_Descriptor cd_G22x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x5y0, buf);
    G22x5y0 *dp, &lv = *(dp=new (buf) G22x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y0)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,36), "G22x5y0");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,24), "G22x5y0");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(32,24), "G22x5y0");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(8,4), "G22x5y0");
    check_base_class_offset(lv, (E22x5*), 0, "G22x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G22x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G22x5y0.ff");
    test_class_info(&lv, &cd_G22x5y0);
    dp->~G22x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y0(Test_G22x5y0, "G22x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x5y0C1Ev();
extern void _ZN7G22x5y0D1Ev();
Name_Map name_map_G22x5y0[] = {
  NSPAIR(_ZN7G22x5y0C1Ev),
  NSPAIR(_ZN7G22x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G22x5y0[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y0[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y0[] = {
  {&(_ZTV7G22x5y0[4]),  4,12},
  {&(_tg__ZTV5E22x5__7G22x5y0[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y0[4]),  4,5},
  {&(_ZTV7G22x5y0[11]),  11,12},
  {&(_tg__ZTV3C22__7G22x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y0[];
extern  VTBL_ENTRY _ZTV7G22x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y0[];
Class_Descriptor cd_G22x5y0 = {  "G22x5y0", // class name
  bases_G22x5y0, 6,
  &(vtc_G22x5y0[0]), // expected_vtbl_contents
  &(vtt_G22x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y1  : virtual E22x5 , F1 {
  int ff;
  ~G22x5y1(); // tgen
  G22x5y1(); // tgen
};
//SIG(1 G22x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x5y1 ::~G22x5y1(){ note_dtor("G22x5y1", this);} // tgen
G22x5y1 ::G22x5y1(){ note_ctor("G22x5y1", this);} // tgen

static void Test_G22x5y1()
{
  extern Class_Descriptor cd_G22x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x5y1, buf);
    G22x5y1 *dp, &lv = *(dp=new (buf) G22x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y1)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,36), "G22x5y1");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,24), "G22x5y1");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(32,24), "G22x5y1");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(24,16), "G22x5y1");
    check_base_class_offset(lv, (E22x5*), ABISELECT(16,12), "G22x5y1");
    check_base_class_offset(lv, (F1*), 0, "G22x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x5y1.ff");
    test_class_info(&lv, &cd_G22x5y1);
    dp->~G22x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y1(Test_G22x5y1, "G22x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x5y1C1Ev();
extern void _ZN7G22x5y1D1Ev();
Name_Map name_map_G22x5y1[] = {
  NSPAIR(_ZN7G22x5y1C1Ev),
  NSPAIR(_ZN7G22x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G22x5y1[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y1[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y1[] = {
  {&(_ZTV7G22x5y1[5]),  5,15},
  {&(_ZTV7G22x5y1[10]),  10,15},
  {&(_ZTV7G22x5y1[14]),  14,15},
  {&(_tg__ZTV5E22x5__7G22x5y1[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y1[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y1[];
extern  VTBL_ENTRY _ZTV7G22x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y1[];
Class_Descriptor cd_G22x5y1 = {  "G22x5y1", // class name
  bases_G22x5y1, 6,
  &(vtc_G22x5y1[0]), // expected_vtbl_contents
  &(vtt_G22x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y2  : E22x5 , virtual F1 {
  int ff;
  ~G22x5y2(); // tgen
  G22x5y2(); // tgen
};
//SIG(1 G22x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x5y2 ::~G22x5y2(){ note_dtor("G22x5y2", this);} // tgen
G22x5y2 ::G22x5y2(){ note_ctor("G22x5y2", this);} // tgen

static void Test_G22x5y2()
{
  extern Class_Descriptor cd_G22x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x5y2, buf);
    G22x5y2 *dp, &lv = *(dp=new (buf) G22x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y2)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,28), "G22x5y2");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,16), "G22x5y2");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(24,16), "G22x5y2");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(8,4), "G22x5y2");
    check_base_class_offset(lv, (E22x5*), 0, "G22x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G22x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G22x5y2.ff");
    test_class_info(&lv, &cd_G22x5y2);
    dp->~G22x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y2(Test_G22x5y2, "G22x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G22x5y2C1Ev();
extern void _ZN7G22x5y2D1Ev();
Name_Map name_map_G22x5y2[] = {
  NSPAIR(_ZN7G22x5y2C1Ev),
  NSPAIR(_ZN7G22x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y2[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G22x5y2[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G22x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y2[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y2[] = {
  {&(_ZTV7G22x5y2[5]),  5,14},
  {&(_tg__ZTV5E22x5__7G22x5y2[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y2[4]),  4,5},
  {&(_ZTV7G22x5y2[9]),  9,14},
  {&(_ZTV7G22x5y2[13]),  13,14},
  {&(_tg__ZTV3C22__7G22x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y2[];
extern  VTBL_ENTRY _ZTV7G22x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y2[];
Class_Descriptor cd_G22x5y2 = {  "G22x5y2", // class name
  bases_G22x5y2, 6,
  &(vtc_G22x5y2[0]), // expected_vtbl_contents
  &(vtt_G22x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G22x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y3  : virtual E22x5 , virtual F1 {
  int ff;
  ~G22x5y3(); // tgen
  G22x5y3(); // tgen
};
//SIG(1 G22x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x5y3 ::~G22x5y3(){ note_dtor("G22x5y3", this);} // tgen
G22x5y3 ::G22x5y3(){ note_ctor("G22x5y3", this);} // tgen

static void Test_G22x5y3()
{
  extern Class_Descriptor cd_G22x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G22x5y3, buf);
    G22x5y3 *dp, &lv = *(dp=new (buf) G22x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G22x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y3)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x5y3");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x5y3");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(32,20), "G22x5y3");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(24,12), "G22x5y3");
    check_base_class_offset(lv, (E22x5*), ABISELECT(16,8), "G22x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G22x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x5y3.ff");
    test_class_info(&lv, &cd_G22x5y3);
    dp->~G22x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y3(Test_G22x5y3, "G22x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G22x5y3C1Ev();
extern void _ZN7G22x5y3D1Ev();
Name_Map name_map_G22x5y3[] = {
  NSPAIR(_ZN7G22x5y3C1Ev),
  NSPAIR(_ZN7G22x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y3[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G22x5y3[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G22x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y3[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y3[] = {
  {&(_ZTV7G22x5y3[6]),  6,19},
  {&(_ZTV7G22x5y3[10]),  10,19},
  {&(_ZTV7G22x5y3[14]),  14,19},
  {&(_ZTV7G22x5y3[18]),  18,19},
  {&(_tg__ZTV5E22x5__7G22x5y3[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y3[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y3[];
extern  VTBL_ENTRY _ZTV7G22x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y3[];
Class_Descriptor cd_G22x5y3 = {  "G22x5y3", // class name
  bases_G22x5y3, 6,
  &(vtc_G22x5y3[0]), // expected_vtbl_contents
  &(vtt_G22x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G22x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y4  : E22x5 , F0 {
  int ff;
  ~G22x5y4(); // tgen
  G22x5y4(); // tgen
};
//SIG(1 G22x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G22x5y4 ::~G22x5y4(){ note_dtor("G22x5y4", this);} // tgen
G22x5y4 ::G22x5y4(){ note_ctor("G22x5y4", this);} // tgen

static void Test_G22x5y4()
{
  extern Class_Descriptor cd_G22x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x5y4, buf);
    G22x5y4 *dp, &lv = *(dp=new (buf) G22x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y4)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,32), "G22x5y4");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,20), "G22x5y4");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(24,20), "G22x5y4");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(8,4), "G22x5y4");
    check_base_class_offset(lv, (E22x5*), 0, "G22x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G22x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G22x5y4.ff");
    test_class_info(&lv, &cd_G22x5y4);
    dp->~G22x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y4(Test_G22x5y4, "G22x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x5y4C1Ev();
extern void _ZN7G22x5y4D1Ev();
Name_Map name_map_G22x5y4[] = {
  NSPAIR(_ZN7G22x5y4C1Ev),
  NSPAIR(_ZN7G22x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G22x5y4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y4[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y4[] = {
  {&(_ZTV7G22x5y4[4]),  4,9},
  {&(_tg__ZTV5E22x5__7G22x5y4[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y4[4]),  4,5},
  {&(_ZTV7G22x5y4[8]),  8,9},
  {&(_tg__ZTV3C22__7G22x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y4[];
extern  VTBL_ENTRY _ZTV7G22x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y4[];
Class_Descriptor cd_G22x5y4 = {  "G22x5y4", // class name
  bases_G22x5y4, 6,
  &(vtc_G22x5y4[0]), // expected_vtbl_contents
  &(vtt_G22x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y5  : virtual E22x5 , F0 {
  int ff;
  ~G22x5y5(); // tgen
  G22x5y5(); // tgen
};
//SIG(1 G22x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G22x5y5 ::~G22x5y5(){ note_dtor("G22x5y5", this);} // tgen
G22x5y5 ::G22x5y5(){ note_ctor("G22x5y5", this);} // tgen

static void Test_G22x5y5()
{
  extern Class_Descriptor cd_G22x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x5y5, buf);
    G22x5y5 *dp, &lv = *(dp=new (buf) G22x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y5)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,36), "G22x5y5");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,24), "G22x5y5");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(32,24), "G22x5y5");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(24,16), "G22x5y5");
    check_base_class_offset(lv, (E22x5*), ABISELECT(16,12), "G22x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x5y5.ff");
    test_class_info(&lv, &cd_G22x5y5);
    dp->~G22x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y5(Test_G22x5y5, "G22x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x5y5C1Ev();
extern void _ZN7G22x5y5D1Ev();
Name_Map name_map_G22x5y5[] = {
  NSPAIR(_ZN7G22x5y5C1Ev),
  NSPAIR(_ZN7G22x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G22x5y5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y5[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y5[] = {
  {&(_ZTV7G22x5y5[5]),  5,14},
  {&(_ZTV7G22x5y5[9]),  9,14},
  {&(_ZTV7G22x5y5[13]),  13,14},
  {&(_tg__ZTV5E22x5__7G22x5y5[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y5[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y5[];
extern  VTBL_ENTRY _ZTV7G22x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y5[];
Class_Descriptor cd_G22x5y5 = {  "G22x5y5", // class name
  bases_G22x5y5, 6,
  &(vtc_G22x5y5[0]), // expected_vtbl_contents
  &(vtt_G22x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y6  : E22x5 , virtual F0 {
  int ff;
  ~G22x5y6(); // tgen
  G22x5y6(); // tgen
};
//SIG(1 G22x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x5y6 ::~G22x5y6(){ note_dtor("G22x5y6", this);} // tgen
G22x5y6 ::G22x5y6(){ note_ctor("G22x5y6", this);} // tgen

static void Test_G22x5y6()
{
  extern Class_Descriptor cd_G22x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x5y6, buf);
    G22x5y6 *dp, &lv = *(dp=new (buf) G22x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y6)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,28), "G22x5y6");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,16), "G22x5y6");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(24,16), "G22x5y6");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(8,4), "G22x5y6");
    check_base_class_offset(lv, (E22x5*), 0, "G22x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G22x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G22x5y6.ff");
    test_class_info(&lv, &cd_G22x5y6);
    dp->~G22x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y6(Test_G22x5y6, "G22x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x5y6C1Ev();
extern void _ZN7G22x5y6D1Ev();
Name_Map name_map_G22x5y6[] = {
  NSPAIR(_ZN7G22x5y6C1Ev),
  NSPAIR(_ZN7G22x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G22x5y6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y6[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y6[] = {
  {&(_ZTV7G22x5y6[5]),  5,10},
  {&(_tg__ZTV5E22x5__7G22x5y6[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y6[4]),  4,5},
  {&(_ZTV7G22x5y6[9]),  9,10},
  {&(_tg__ZTV3C22__7G22x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y6[];
extern  VTBL_ENTRY _ZTV7G22x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y6[];
Class_Descriptor cd_G22x5y6 = {  "G22x5y6", // class name
  bases_G22x5y6, 6,
  &(vtc_G22x5y6[0]), // expected_vtbl_contents
  &(vtt_G22x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x5y7  : virtual E22x5 , virtual F0 {
  int ff;
  ~G22x5y7(); // tgen
  G22x5y7(); // tgen
};
//SIG(1 G22x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x5y7 ::~G22x5y7(){ note_dtor("G22x5y7", this);} // tgen
G22x5y7 ::G22x5y7(){ note_ctor("G22x5y7", this);} // tgen

static void Test_G22x5y7()
{
  extern Class_Descriptor cd_G22x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x5y7, buf);
    G22x5y7 *dp, &lv = *(dp=new (buf) G22x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x5y7)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x5y7");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x5y7");
    check_base_class_offset(lv, (C22*)(E22x5*), ABISELECT(32,20), "G22x5y7");
    check_base_class_offset(lv, (D0*)(E22x5*), ABISELECT(24,12), "G22x5y7");
    check_base_class_offset(lv, (E22x5*), ABISELECT(16,8), "G22x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G22x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x5y7.ff");
    test_class_info(&lv, &cd_G22x5y7);
    dp->~G22x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x5y7(Test_G22x5y7, "G22x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x5y7C1Ev();
extern void _ZN7G22x5y7D1Ev();
Name_Map name_map_G22x5y7[] = {
  NSPAIR(_ZN7G22x5y7C1Ev),
  NSPAIR(_ZN7G22x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x5;
extern VTBL_ENTRY _ZTI5E22x5[];
extern  VTBL_ENTRY _ZTV5E22x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E22x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x5y7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G22x5y7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x5y7[];
static  VTBL_ENTRY _tg__ZTV5E22x5__7G22x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x5__7G22x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x5y7[] = {
  {&(_ZTV7G22x5y7[6]),  6,15},
  {&(_ZTV7G22x5y7[10]),  10,15},
  {&(_ZTV7G22x5y7[14]),  14,15},
  {&(_tg__ZTV5E22x5__7G22x5y7[4]),  4,4},
  {&(_tg__ZTV3C22__5E22x5__7G22x5y7[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x5y7[];
extern  VTBL_ENTRY _ZTV7G22x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x5y7[];
Class_Descriptor cd_G22x5y7 = {  "G22x5y7", // class name
  bases_G22x5y7, 6,
  &(vtc_G22x5y7[0]), // expected_vtbl_contents
  &(vtt_G22x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x5y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x5y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E23x5  : virtual C23 , D0 {
  int fd;
  ~E23x5(); // tgen
  E23x5(); // tgen
};
//SIG(-1 E23x5) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E23x5 ::~E23x5(){ note_dtor("E23x5", this);} // tgen
E23x5 ::E23x5(){ note_ctor("E23x5", this);} // tgen

static void Test_E23x5()
{
  extern Class_Descriptor cd_E23x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E23x5, buf);
    E23x5 *dp, &lv = *(dp=new (buf) E23x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E23x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x5)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,24), "E23x5");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,12), "E23x5");
    check_base_class_offset(lv, (C23*), ABISELECT(16,12), "E23x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E23x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E23x5.fd");
    test_class_info(&lv, &cd_E23x5);
    dp->~E23x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x5(Test_E23x5, "E23x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E23x5C1Ev();
extern void _ZN5E23x5D1Ev();
Name_Map name_map_E23x5[] = {
  NSPAIR(_ZN5E23x5C1Ev),
  NSPAIR(_ZN5E23x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E23x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E23x5[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV5E23x5[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__5E23x5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x5[] = {
  {&(_ZTV5E23x5[4]),  4,13},
  {&(_ZTV5E23x5[8]),  8,13},
  {&(_ZTV5E23x5[12]),  12,13},
  {&(_tg__ZTV3C23__5E23x5[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__5E23x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
static VTBL_ENTRY alt_thunk_names80[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x5 = {  "E23x5", // class name
  bases_E23x5, 4,
  &(vtc_E23x5[0]), // expected_vtbl_contents
  &(vtt_E23x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E23x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E23x5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E23x5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names80,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y0  : E23x5 , F1 {
  int ff;
  ~G23x5y0(); // tgen
  G23x5y0(); // tgen
};
//SIG(1 G23x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x5y0 ::~G23x5y0(){ note_dtor("G23x5y0", this);} // tgen
G23x5y0 ::G23x5y0(){ note_ctor("G23x5y0", this);} // tgen

static void Test_G23x5y0()
{
  extern Class_Descriptor cd_G23x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x5y0, buf);
    G23x5y0 *dp, &lv = *(dp=new (buf) G23x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y0)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,36), "G23x5y0");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,24), "G23x5y0");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(32,24), "G23x5y0");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(8,4), "G23x5y0");
    check_base_class_offset(lv, (E23x5*), 0, "G23x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G23x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G23x5y0.ff");
    test_class_info(&lv, &cd_G23x5y0);
    dp->~G23x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y0(Test_G23x5y0, "G23x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x5y0C1Ev();
extern void _ZN7G23x5y0D1Ev();
Name_Map name_map_G23x5y0[] = {
  NSPAIR(_ZN7G23x5y0C1Ev),
  NSPAIR(_ZN7G23x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x5y0[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G23x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x5y0[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y0[] = {
  {&(_ZTV7G23x5y0[4]),  4,16},
  {&(_tg__ZTV5E23x5__7G23x5y0[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y0[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y0[3]),  3,4},
  {&(_ZTV7G23x5y0[11]),  11,16},
  {&(_ZTV7G23x5y0[15]),  15,16},
  {&(_tg__ZTV3C23__7G23x5y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y0[];
extern  VTBL_ENTRY _ZTV7G23x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y0[];
static VTBL_ENTRY alt_thunk_names81[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y0 = {  "G23x5y0", // class name
  bases_G23x5y0, 6,
  &(vtc_G23x5y0[0]), // expected_vtbl_contents
  &(vtt_G23x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names81,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y1  : virtual E23x5 , F1 {
  int ff;
  ~G23x5y1(); // tgen
  G23x5y1(); // tgen
};
//SIG(1 G23x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x5y1 ::~G23x5y1(){ note_dtor("G23x5y1", this);} // tgen
G23x5y1 ::G23x5y1(){ note_ctor("G23x5y1", this);} // tgen

static void Test_G23x5y1()
{
  extern Class_Descriptor cd_G23x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x5y1, buf);
    G23x5y1 *dp, &lv = *(dp=new (buf) G23x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y1)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,36), "G23x5y1");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,24), "G23x5y1");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(32,24), "G23x5y1");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(24,16), "G23x5y1");
    check_base_class_offset(lv, (E23x5*), ABISELECT(16,12), "G23x5y1");
    check_base_class_offset(lv, (F1*), 0, "G23x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x5y1.ff");
    test_class_info(&lv, &cd_G23x5y1);
    dp->~G23x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y1(Test_G23x5y1, "G23x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x5y1C1Ev();
extern void _ZN7G23x5y1D1Ev();
Name_Map name_map_G23x5y1[] = {
  NSPAIR(_ZN7G23x5y1C1Ev),
  NSPAIR(_ZN7G23x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x5y1[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G23x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x5y1[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y1[] = {
  {&(_ZTV7G23x5y1[5]),  5,19},
  {&(_ZTV7G23x5y1[10]),  10,19},
  {&(_ZTV7G23x5y1[14]),  14,19},
  {&(_ZTV7G23x5y1[18]),  18,19},
  {&(_tg__ZTV5E23x5__7G23x5y1[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y1[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y1[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x5y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y1[];
extern  VTBL_ENTRY _ZTV7G23x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y1[];
static VTBL_ENTRY alt_thunk_names82[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y1 = {  "G23x5y1", // class name
  bases_G23x5y1, 6,
  &(vtc_G23x5y1[0]), // expected_vtbl_contents
  &(vtt_G23x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names82,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y2  : E23x5 , virtual F1 {
  int ff;
  ~G23x5y2(); // tgen
  G23x5y2(); // tgen
};
//SIG(1 G23x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x5y2 ::~G23x5y2(){ note_dtor("G23x5y2", this);} // tgen
G23x5y2 ::G23x5y2(){ note_ctor("G23x5y2", this);} // tgen

static void Test_G23x5y2()
{
  extern Class_Descriptor cd_G23x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x5y2, buf);
    G23x5y2 *dp, &lv = *(dp=new (buf) G23x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y2)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,28), "G23x5y2");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,16), "G23x5y2");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(24,16), "G23x5y2");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(8,4), "G23x5y2");
    check_base_class_offset(lv, (E23x5*), 0, "G23x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G23x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G23x5y2.ff");
    test_class_info(&lv, &cd_G23x5y2);
    dp->~G23x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y2(Test_G23x5y2, "G23x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G23x5y2C1Ev();
extern void _ZN7G23x5y2D1Ev();
Name_Map name_map_G23x5y2[] = {
  NSPAIR(_ZN7G23x5y2C1Ev),
  NSPAIR(_ZN7G23x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y2[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G23x5y2[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G23x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x5y2[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y2[] = {
  {&(_ZTV7G23x5y2[5]),  5,18},
  {&(_tg__ZTV5E23x5__7G23x5y2[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y2[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y2[3]),  3,4},
  {&(_ZTV7G23x5y2[9]),  9,18},
  {&(_ZTV7G23x5y2[13]),  13,18},
  {&(_ZTV7G23x5y2[17]),  17,18},
  {&(_tg__ZTV3C23__7G23x5y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y2[];
extern  VTBL_ENTRY _ZTV7G23x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y2[];
static VTBL_ENTRY alt_thunk_names83[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y2 = {  "G23x5y2", // class name
  bases_G23x5y2, 6,
  &(vtc_G23x5y2[0]), // expected_vtbl_contents
  &(vtt_G23x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G23x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names83,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y3  : virtual E23x5 , virtual F1 {
  int ff;
  ~G23x5y3(); // tgen
  G23x5y3(); // tgen
};
//SIG(1 G23x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x5y3 ::~G23x5y3(){ note_dtor("G23x5y3", this);} // tgen
G23x5y3 ::G23x5y3(){ note_ctor("G23x5y3", this);} // tgen

static void Test_G23x5y3()
{
  extern Class_Descriptor cd_G23x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G23x5y3, buf);
    G23x5y3 *dp, &lv = *(dp=new (buf) G23x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G23x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y3)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x5y3");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x5y3");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(32,20), "G23x5y3");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(24,12), "G23x5y3");
    check_base_class_offset(lv, (E23x5*), ABISELECT(16,8), "G23x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G23x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x5y3.ff");
    test_class_info(&lv, &cd_G23x5y3);
    dp->~G23x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y3(Test_G23x5y3, "G23x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G23x5y3C1Ev();
extern void _ZN7G23x5y3D1Ev();
Name_Map name_map_G23x5y3[] = {
  NSPAIR(_ZN7G23x5y3C1Ev),
  NSPAIR(_ZN7G23x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y3[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G23x5y3[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G23x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G23x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x5y3[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y3[] = {
  {&(_ZTV7G23x5y3[6]),  6,23},
  {&(_ZTV7G23x5y3[10]),  10,23},
  {&(_ZTV7G23x5y3[14]),  14,23},
  {&(_ZTV7G23x5y3[18]),  18,23},
  {&(_ZTV7G23x5y3[22]),  22,23},
  {&(_tg__ZTV5E23x5__7G23x5y3[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y3[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y3[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x5y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y3[];
extern  VTBL_ENTRY _ZTV7G23x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y3[];
static VTBL_ENTRY alt_thunk_names84[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y3 = {  "G23x5y3", // class name
  bases_G23x5y3, 6,
  &(vtc_G23x5y3[0]), // expected_vtbl_contents
  &(vtt_G23x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G23x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names84,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y4  : E23x5 , F0 {
  int ff;
  ~G23x5y4(); // tgen
  G23x5y4(); // tgen
};
//SIG(1 G23x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G23x5y4 ::~G23x5y4(){ note_dtor("G23x5y4", this);} // tgen
G23x5y4 ::G23x5y4(){ note_ctor("G23x5y4", this);} // tgen

static void Test_G23x5y4()
{
  extern Class_Descriptor cd_G23x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x5y4, buf);
    G23x5y4 *dp, &lv = *(dp=new (buf) G23x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y4)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,32), "G23x5y4");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,20), "G23x5y4");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(24,20), "G23x5y4");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(8,4), "G23x5y4");
    check_base_class_offset(lv, (E23x5*), 0, "G23x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G23x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G23x5y4.ff");
    test_class_info(&lv, &cd_G23x5y4);
    dp->~G23x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y4(Test_G23x5y4, "G23x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x5y4C1Ev();
extern void _ZN7G23x5y4D1Ev();
Name_Map name_map_G23x5y4[] = {
  NSPAIR(_ZN7G23x5y4C1Ev),
  NSPAIR(_ZN7G23x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y4[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G23x5y4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G23x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x5y4[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y4[] = {
  {&(_ZTV7G23x5y4[4]),  4,13},
  {&(_tg__ZTV5E23x5__7G23x5y4[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y4[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y4[3]),  3,4},
  {&(_ZTV7G23x5y4[8]),  8,13},
  {&(_ZTV7G23x5y4[12]),  12,13},
  {&(_tg__ZTV3C23__7G23x5y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y4[];
extern  VTBL_ENTRY _ZTV7G23x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y4[];
static VTBL_ENTRY alt_thunk_names85[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y4 = {  "G23x5y4", // class name
  bases_G23x5y4, 6,
  &(vtc_G23x5y4[0]), // expected_vtbl_contents
  &(vtt_G23x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names85,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y5  : virtual E23x5 , F0 {
  int ff;
  ~G23x5y5(); // tgen
  G23x5y5(); // tgen
};
//SIG(1 G23x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G23x5y5 ::~G23x5y5(){ note_dtor("G23x5y5", this);} // tgen
G23x5y5 ::G23x5y5(){ note_ctor("G23x5y5", this);} // tgen

static void Test_G23x5y5()
{
  extern Class_Descriptor cd_G23x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x5y5, buf);
    G23x5y5 *dp, &lv = *(dp=new (buf) G23x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y5)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,36), "G23x5y5");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,24), "G23x5y5");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(32,24), "G23x5y5");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(24,16), "G23x5y5");
    check_base_class_offset(lv, (E23x5*), ABISELECT(16,12), "G23x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x5y5.ff");
    test_class_info(&lv, &cd_G23x5y5);
    dp->~G23x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y5(Test_G23x5y5, "G23x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x5y5C1Ev();
extern void _ZN7G23x5y5D1Ev();
Name_Map name_map_G23x5y5[] = {
  NSPAIR(_ZN7G23x5y5C1Ev),
  NSPAIR(_ZN7G23x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y5[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x5y5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G23x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x5y5[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y5[] = {
  {&(_ZTV7G23x5y5[5]),  5,18},
  {&(_ZTV7G23x5y5[9]),  9,18},
  {&(_ZTV7G23x5y5[13]),  13,18},
  {&(_ZTV7G23x5y5[17]),  17,18},
  {&(_tg__ZTV5E23x5__7G23x5y5[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y5[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y5[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x5y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y5[];
extern  VTBL_ENTRY _ZTV7G23x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y5[];
static VTBL_ENTRY alt_thunk_names86[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y5 = {  "G23x5y5", // class name
  bases_G23x5y5, 6,
  &(vtc_G23x5y5[0]), // expected_vtbl_contents
  &(vtt_G23x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names86,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y6  : E23x5 , virtual F0 {
  int ff;
  ~G23x5y6(); // tgen
  G23x5y6(); // tgen
};
//SIG(1 G23x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x5y6 ::~G23x5y6(){ note_dtor("G23x5y6", this);} // tgen
G23x5y6 ::G23x5y6(){ note_ctor("G23x5y6", this);} // tgen

static void Test_G23x5y6()
{
  extern Class_Descriptor cd_G23x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x5y6, buf);
    G23x5y6 *dp, &lv = *(dp=new (buf) G23x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y6)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,28), "G23x5y6");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,16), "G23x5y6");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(24,16), "G23x5y6");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(8,4), "G23x5y6");
    check_base_class_offset(lv, (E23x5*), 0, "G23x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G23x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G23x5y6.ff");
    test_class_info(&lv, &cd_G23x5y6);
    dp->~G23x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y6(Test_G23x5y6, "G23x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x5y6C1Ev();
extern void _ZN7G23x5y6D1Ev();
Name_Map name_map_G23x5y6[] = {
  NSPAIR(_ZN7G23x5y6C1Ev),
  NSPAIR(_ZN7G23x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y6[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G23x5y6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x5y6[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y6[] = {
  {&(_ZTV7G23x5y6[5]),  5,14},
  {&(_tg__ZTV5E23x5__7G23x5y6[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y6[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y6[3]),  3,4},
  {&(_ZTV7G23x5y6[9]),  9,14},
  {&(_ZTV7G23x5y6[13]),  13,14},
  {&(_tg__ZTV3C23__7G23x5y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y6[];
extern  VTBL_ENTRY _ZTV7G23x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y6[];
static VTBL_ENTRY alt_thunk_names87[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y6 = {  "G23x5y6", // class name
  bases_G23x5y6, 6,
  &(vtc_G23x5y6[0]), // expected_vtbl_contents
  &(vtt_G23x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names87,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x5y7  : virtual E23x5 , virtual F0 {
  int ff;
  ~G23x5y7(); // tgen
  G23x5y7(); // tgen
};
//SIG(1 G23x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x5y7 ::~G23x5y7(){ note_dtor("G23x5y7", this);} // tgen
G23x5y7 ::G23x5y7(){ note_ctor("G23x5y7", this);} // tgen

static void Test_G23x5y7()
{
  extern Class_Descriptor cd_G23x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x5y7, buf);
    G23x5y7 *dp, &lv = *(dp=new (buf) G23x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x5y7)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x5y7");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x5y7");
    check_base_class_offset(lv, (C23*)(E23x5*), ABISELECT(32,20), "G23x5y7");
    check_base_class_offset(lv, (D0*)(E23x5*), ABISELECT(24,12), "G23x5y7");
    check_base_class_offset(lv, (E23x5*), ABISELECT(16,8), "G23x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G23x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x5y7.ff");
    test_class_info(&lv, &cd_G23x5y7);
    dp->~G23x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x5y7(Test_G23x5y7, "G23x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x5y7C1Ev();
extern void _ZN7G23x5y7D1Ev();
Name_Map name_map_G23x5y7[] = {
  NSPAIR(_ZN7G23x5y7C1Ev),
  NSPAIR(_ZN7G23x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x5;
extern VTBL_ENTRY _ZTI5E23x5[];
extern  VTBL_ENTRY _ZTV5E23x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E23x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x5y7[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G23x5y7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G23x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x5y7[];
static  VTBL_ENTRY _tg__ZTV5E23x5__7G23x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x5__7G23x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x5__7G23x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x5y7[] = {
  {&(_ZTV7G23x5y7[6]),  6,19},
  {&(_ZTV7G23x5y7[10]),  10,19},
  {&(_ZTV7G23x5y7[14]),  14,19},
  {&(_ZTV7G23x5y7[18]),  18,19},
  {&(_tg__ZTV5E23x5__7G23x5y7[4]),  4,4},
  {&(_tg__ZTV3C23__5E23x5__7G23x5y7[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x5__7G23x5y7[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x5y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x5y7[];
extern  VTBL_ENTRY _ZTV7G23x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x5y7[];
static VTBL_ENTRY alt_thunk_names88[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x5y7 = {  "G23x5y7", // class name
  bases_G23x5y7, 6,
  &(vtc_G23x5y7[0]), // expected_vtbl_contents
  &(vtt_G23x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x5y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x5y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names88,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x5  : virtual C24 , D0 {
  int fd;
  ~E24x5(); // tgen
  E24x5(); // tgen
};
//SIG(-1 E24x5) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E24x5 ::~E24x5(){ note_dtor("E24x5", this);} // tgen
E24x5 ::E24x5(){ note_ctor("E24x5", this);} // tgen

static void Test_E24x5()
{
  extern Class_Descriptor cd_E24x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E24x5, buf);
    E24x5 *dp, &lv = *(dp=new (buf) E24x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E24x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x5)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,16), "E24x5");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,24), "E24x5");
    check_base_class_offset(lv, (C24*), ABISELECT(16,12), "E24x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E24x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E24x5.fd");
    test_class_info(&lv, &cd_E24x5);
    dp->~E24x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x5(Test_E24x5, "E24x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E24x5C1Ev();
extern void _ZN5E24x5D1Ev();
Name_Map name_map_E24x5[] = {
  NSPAIR(_ZN5E24x5C1Ev),
  NSPAIR(_ZN5E24x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E24x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E24x5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_E24x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV5E24x5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x5[] = {
  {&(_ZTV5E24x5[4]),  4,9},
  {&(_ZTV5E24x5[8]),  8,9},
  {&(_tg__ZTV3C24__5E24x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
Class_Descriptor cd_E24x5 = {  "E24x5", // class name
  bases_E24x5, 4,
  &(vtc_E24x5[0]), // expected_vtbl_contents
  &(vtt_E24x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E24x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E24x5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E24x5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y0  : E24x5 , F1 {
  int ff;
  ~G24x5y0(); // tgen
  G24x5y0(); // tgen
};
//SIG(1 G24x5y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x5y0 ::~G24x5y0(){ note_dtor("G24x5y0", this);} // tgen
G24x5y0 ::G24x5y0(){ note_ctor("G24x5y0", this);} // tgen

static void Test_G24x5y0()
{
  extern Class_Descriptor cd_G24x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x5y0, buf);
    G24x5y0 *dp, &lv = *(dp=new (buf) G24x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y0)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,28), "G24x5y0");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,36), "G24x5y0");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(32,24), "G24x5y0");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(8,4), "G24x5y0");
    check_base_class_offset(lv, (E24x5*), 0, "G24x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G24x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G24x5y0.ff");
    test_class_info(&lv, &cd_G24x5y0);
    dp->~G24x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y0(Test_G24x5y0, "G24x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x5y0C1Ev();
extern void _ZN7G24x5y0D1Ev();
Name_Map name_map_G24x5y0[] = {
  NSPAIR(_ZN7G24x5y0C1Ev),
  NSPAIR(_ZN7G24x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G24x5y0[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y0[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y0[] = {
  {&(_ZTV7G24x5y0[4]),  4,12},
  {&(_tg__ZTV5E24x5__7G24x5y0[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y0[4]),  4,5},
  {&(_ZTV7G24x5y0[11]),  11,12},
  {&(_tg__ZTV3C24__7G24x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y0[];
extern  VTBL_ENTRY _ZTV7G24x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y0[];
Class_Descriptor cd_G24x5y0 = {  "G24x5y0", // class name
  bases_G24x5y0, 6,
  &(vtc_G24x5y0[0]), // expected_vtbl_contents
  &(vtt_G24x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y1  : virtual E24x5 , F1 {
  int ff;
  ~G24x5y1(); // tgen
  G24x5y1(); // tgen
};
//SIG(1 G24x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x5y1 ::~G24x5y1(){ note_dtor("G24x5y1", this);} // tgen
G24x5y1 ::G24x5y1(){ note_ctor("G24x5y1", this);} // tgen

static void Test_G24x5y1()
{
  extern Class_Descriptor cd_G24x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x5y1, buf);
    G24x5y1 *dp, &lv = *(dp=new (buf) G24x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y1)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,28), "G24x5y1");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,36), "G24x5y1");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(32,24), "G24x5y1");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(24,16), "G24x5y1");
    check_base_class_offset(lv, (E24x5*), ABISELECT(16,12), "G24x5y1");
    check_base_class_offset(lv, (F1*), 0, "G24x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x5y1.ff");
    test_class_info(&lv, &cd_G24x5y1);
    dp->~G24x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y1(Test_G24x5y1, "G24x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x5y1C1Ev();
extern void _ZN7G24x5y1D1Ev();
Name_Map name_map_G24x5y1[] = {
  NSPAIR(_ZN7G24x5y1C1Ev),
  NSPAIR(_ZN7G24x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G24x5y1[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y1[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y1[] = {
  {&(_ZTV7G24x5y1[5]),  5,15},
  {&(_ZTV7G24x5y1[10]),  10,15},
  {&(_ZTV7G24x5y1[14]),  14,15},
  {&(_tg__ZTV5E24x5__7G24x5y1[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y1[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y1[];
extern  VTBL_ENTRY _ZTV7G24x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y1[];
Class_Descriptor cd_G24x5y1 = {  "G24x5y1", // class name
  bases_G24x5y1, 6,
  &(vtc_G24x5y1[0]), // expected_vtbl_contents
  &(vtt_G24x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y2  : E24x5 , virtual F1 {
  int ff;
  ~G24x5y2(); // tgen
  G24x5y2(); // tgen
};
//SIG(1 G24x5y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x5y2 ::~G24x5y2(){ note_dtor("G24x5y2", this);} // tgen
G24x5y2 ::G24x5y2(){ note_ctor("G24x5y2", this);} // tgen

static void Test_G24x5y2()
{
  extern Class_Descriptor cd_G24x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x5y2, buf);
    G24x5y2 *dp, &lv = *(dp=new (buf) G24x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y2)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,20), "G24x5y2");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,28), "G24x5y2");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(24,16), "G24x5y2");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(8,4), "G24x5y2");
    check_base_class_offset(lv, (E24x5*), 0, "G24x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G24x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G24x5y2.ff");
    test_class_info(&lv, &cd_G24x5y2);
    dp->~G24x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y2(Test_G24x5y2, "G24x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G24x5y2C1Ev();
extern void _ZN7G24x5y2D1Ev();
Name_Map name_map_G24x5y2[] = {
  NSPAIR(_ZN7G24x5y2C1Ev),
  NSPAIR(_ZN7G24x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y2[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G24x5y2[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G24x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y2[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y2[] = {
  {&(_ZTV7G24x5y2[5]),  5,14},
  {&(_tg__ZTV5E24x5__7G24x5y2[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y2[4]),  4,5},
  {&(_ZTV7G24x5y2[9]),  9,14},
  {&(_ZTV7G24x5y2[13]),  13,14},
  {&(_tg__ZTV3C24__7G24x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y2[];
extern  VTBL_ENTRY _ZTV7G24x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y2[];
Class_Descriptor cd_G24x5y2 = {  "G24x5y2", // class name
  bases_G24x5y2, 6,
  &(vtc_G24x5y2[0]), // expected_vtbl_contents
  &(vtt_G24x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G24x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y3  : virtual E24x5 , virtual F1 {
  int ff;
  ~G24x5y3(); // tgen
  G24x5y3(); // tgen
};
//SIG(1 G24x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x5y3 ::~G24x5y3(){ note_dtor("G24x5y3", this);} // tgen
G24x5y3 ::G24x5y3(){ note_ctor("G24x5y3", this);} // tgen

static void Test_G24x5y3()
{
  extern Class_Descriptor cd_G24x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G24x5y3, buf);
    G24x5y3 *dp, &lv = *(dp=new (buf) G24x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G24x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y3)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x5y3");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x5y3");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(32,20), "G24x5y3");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(24,12), "G24x5y3");
    check_base_class_offset(lv, (E24x5*), ABISELECT(16,8), "G24x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G24x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x5y3.ff");
    test_class_info(&lv, &cd_G24x5y3);
    dp->~G24x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y3(Test_G24x5y3, "G24x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G24x5y3C1Ev();
extern void _ZN7G24x5y3D1Ev();
Name_Map name_map_G24x5y3[] = {
  NSPAIR(_ZN7G24x5y3C1Ev),
  NSPAIR(_ZN7G24x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y3[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G24x5y3[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G24x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y3[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y3[] = {
  {&(_ZTV7G24x5y3[6]),  6,19},
  {&(_ZTV7G24x5y3[10]),  10,19},
  {&(_ZTV7G24x5y3[14]),  14,19},
  {&(_ZTV7G24x5y3[18]),  18,19},
  {&(_tg__ZTV5E24x5__7G24x5y3[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y3[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y3[];
extern  VTBL_ENTRY _ZTV7G24x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y3[];
Class_Descriptor cd_G24x5y3 = {  "G24x5y3", // class name
  bases_G24x5y3, 6,
  &(vtc_G24x5y3[0]), // expected_vtbl_contents
  &(vtt_G24x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G24x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y4  : E24x5 , F0 {
  int ff;
  ~G24x5y4(); // tgen
  G24x5y4(); // tgen
};
//SIG(1 G24x5y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G24x5y4 ::~G24x5y4(){ note_dtor("G24x5y4", this);} // tgen
G24x5y4 ::G24x5y4(){ note_ctor("G24x5y4", this);} // tgen

static void Test_G24x5y4()
{
  extern Class_Descriptor cd_G24x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x5y4, buf);
    G24x5y4 *dp, &lv = *(dp=new (buf) G24x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y4)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,24), "G24x5y4");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,32), "G24x5y4");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(24,20), "G24x5y4");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(8,4), "G24x5y4");
    check_base_class_offset(lv, (E24x5*), 0, "G24x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G24x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G24x5y4.ff");
    test_class_info(&lv, &cd_G24x5y4);
    dp->~G24x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y4(Test_G24x5y4, "G24x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x5y4C1Ev();
extern void _ZN7G24x5y4D1Ev();
Name_Map name_map_G24x5y4[] = {
  NSPAIR(_ZN7G24x5y4C1Ev),
  NSPAIR(_ZN7G24x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G24x5y4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y4[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y4[] = {
  {&(_ZTV7G24x5y4[4]),  4,9},
  {&(_tg__ZTV5E24x5__7G24x5y4[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y4[4]),  4,5},
  {&(_ZTV7G24x5y4[8]),  8,9},
  {&(_tg__ZTV3C24__7G24x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y4[];
extern  VTBL_ENTRY _ZTV7G24x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y4[];
Class_Descriptor cd_G24x5y4 = {  "G24x5y4", // class name
  bases_G24x5y4, 6,
  &(vtc_G24x5y4[0]), // expected_vtbl_contents
  &(vtt_G24x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y5  : virtual E24x5 , F0 {
  int ff;
  ~G24x5y5(); // tgen
  G24x5y5(); // tgen
};
//SIG(1 G24x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G24x5y5 ::~G24x5y5(){ note_dtor("G24x5y5", this);} // tgen
G24x5y5 ::G24x5y5(){ note_ctor("G24x5y5", this);} // tgen

static void Test_G24x5y5()
{
  extern Class_Descriptor cd_G24x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x5y5, buf);
    G24x5y5 *dp, &lv = *(dp=new (buf) G24x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y5)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,28), "G24x5y5");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,36), "G24x5y5");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(32,24), "G24x5y5");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(24,16), "G24x5y5");
    check_base_class_offset(lv, (E24x5*), ABISELECT(16,12), "G24x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x5y5.ff");
    test_class_info(&lv, &cd_G24x5y5);
    dp->~G24x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y5(Test_G24x5y5, "G24x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x5y5C1Ev();
extern void _ZN7G24x5y5D1Ev();
Name_Map name_map_G24x5y5[] = {
  NSPAIR(_ZN7G24x5y5C1Ev),
  NSPAIR(_ZN7G24x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G24x5y5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y5[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y5[] = {
  {&(_ZTV7G24x5y5[5]),  5,14},
  {&(_ZTV7G24x5y5[9]),  9,14},
  {&(_ZTV7G24x5y5[13]),  13,14},
  {&(_tg__ZTV5E24x5__7G24x5y5[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y5[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y5[];
extern  VTBL_ENTRY _ZTV7G24x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y5[];
Class_Descriptor cd_G24x5y5 = {  "G24x5y5", // class name
  bases_G24x5y5, 6,
  &(vtc_G24x5y5[0]), // expected_vtbl_contents
  &(vtt_G24x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y6  : E24x5 , virtual F0 {
  int ff;
  ~G24x5y6(); // tgen
  G24x5y6(); // tgen
};
//SIG(1 G24x5y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x5y6 ::~G24x5y6(){ note_dtor("G24x5y6", this);} // tgen
G24x5y6 ::G24x5y6(){ note_ctor("G24x5y6", this);} // tgen

static void Test_G24x5y6()
{
  extern Class_Descriptor cd_G24x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x5y6, buf);
    G24x5y6 *dp, &lv = *(dp=new (buf) G24x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y6)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,20), "G24x5y6");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,28), "G24x5y6");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(24,16), "G24x5y6");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(8,4), "G24x5y6");
    check_base_class_offset(lv, (E24x5*), 0, "G24x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G24x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G24x5y6.ff");
    test_class_info(&lv, &cd_G24x5y6);
    dp->~G24x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y6(Test_G24x5y6, "G24x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x5y6C1Ev();
extern void _ZN7G24x5y6D1Ev();
Name_Map name_map_G24x5y6[] = {
  NSPAIR(_ZN7G24x5y6C1Ev),
  NSPAIR(_ZN7G24x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G24x5y6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y6[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y6[] = {
  {&(_ZTV7G24x5y6[5]),  5,10},
  {&(_tg__ZTV5E24x5__7G24x5y6[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y6[4]),  4,5},
  {&(_ZTV7G24x5y6[9]),  9,10},
  {&(_tg__ZTV3C24__7G24x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y6[];
extern  VTBL_ENTRY _ZTV7G24x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y6[];
Class_Descriptor cd_G24x5y6 = {  "G24x5y6", // class name
  bases_G24x5y6, 6,
  &(vtc_G24x5y6[0]), // expected_vtbl_contents
  &(vtt_G24x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x5y7  : virtual E24x5 , virtual F0 {
  int ff;
  ~G24x5y7(); // tgen
  G24x5y7(); // tgen
};
//SIG(1 G24x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x5y7 ::~G24x5y7(){ note_dtor("G24x5y7", this);} // tgen
G24x5y7 ::G24x5y7(){ note_ctor("G24x5y7", this);} // tgen

static void Test_G24x5y7()
{
  extern Class_Descriptor cd_G24x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x5y7, buf);
    G24x5y7 *dp, &lv = *(dp=new (buf) G24x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x5y7)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x5y7");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x5y7");
    check_base_class_offset(lv, (C24*)(E24x5*), ABISELECT(32,20), "G24x5y7");
    check_base_class_offset(lv, (D0*)(E24x5*), ABISELECT(24,12), "G24x5y7");
    check_base_class_offset(lv, (E24x5*), ABISELECT(16,8), "G24x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G24x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x5y7.ff");
    test_class_info(&lv, &cd_G24x5y7);
    dp->~G24x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x5y7(Test_G24x5y7, "G24x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x5y7C1Ev();
extern void _ZN7G24x5y7D1Ev();
Name_Map name_map_G24x5y7[] = {
  NSPAIR(_ZN7G24x5y7C1Ev),
  NSPAIR(_ZN7G24x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x5;
extern VTBL_ENTRY _ZTI5E24x5[];
extern  VTBL_ENTRY _ZTV5E24x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E24x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x5y7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G24x5y7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x5y7[];
static  VTBL_ENTRY _tg__ZTV5E24x5__7G24x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x5__7G24x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x5y7[] = {
  {&(_ZTV7G24x5y7[6]),  6,15},
  {&(_ZTV7G24x5y7[10]),  10,15},
  {&(_ZTV7G24x5y7[14]),  14,15},
  {&(_tg__ZTV5E24x5__7G24x5y7[4]),  4,4},
  {&(_tg__ZTV3C24__5E24x5__7G24x5y7[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x5y7[];
extern  VTBL_ENTRY _ZTV7G24x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x5y7[];
Class_Descriptor cd_G24x5y7 = {  "G24x5y7", // class name
  bases_G24x5y7, 6,
  &(vtc_G24x5y7[0]), // expected_vtbl_contents
  &(vtt_G24x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x5y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x5y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E25x5  : virtual C25 , D0 {
  int fd;
  ~E25x5(); // tgen
  E25x5(); // tgen
};
//SIG(-1 E25x5) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E25x5 ::~E25x5(){ note_dtor("E25x5", this);} // tgen
E25x5 ::E25x5(){ note_ctor("E25x5", this);} // tgen

static void Test_E25x5()
{
  extern Class_Descriptor cd_E25x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E25x5, buf);
    E25x5 *dp, &lv = *(dp=new (buf) E25x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E25x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x5)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,12), "E25x5");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,24), "E25x5");
    check_base_class_offset(lv, (C25*), ABISELECT(16,12), "E25x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E25x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E25x5.fd");
    test_class_info(&lv, &cd_E25x5);
    dp->~E25x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x5(Test_E25x5, "E25x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E25x5C1Ev();
extern void _ZN5E25x5D1Ev();
Name_Map name_map_E25x5[] = {
  NSPAIR(_ZN5E25x5C1Ev),
  NSPAIR(_ZN5E25x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E25x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E25x5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_E25x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV5E25x5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x5[] = {
  {&(_ZTV5E25x5[4]),  4,9},
  {&(_ZTV5E25x5[8]),  8,9},
  {&(_tg__ZTV3C25__5E25x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
Class_Descriptor cd_E25x5 = {  "E25x5", // class name
  bases_E25x5, 4,
  &(vtc_E25x5[0]), // expected_vtbl_contents
  &(vtt_E25x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E25x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E25x5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E25x5),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y0  : E25x5 , F1 {
  int ff;
  ~G25x5y0(); // tgen
  G25x5y0(); // tgen
};
//SIG(1 G25x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x5y0 ::~G25x5y0(){ note_dtor("G25x5y0", this);} // tgen
G25x5y0 ::G25x5y0(){ note_ctor("G25x5y0", this);} // tgen

static void Test_G25x5y0()
{
  extern Class_Descriptor cd_G25x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x5y0, buf);
    G25x5y0 *dp, &lv = *(dp=new (buf) G25x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y0)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,24), "G25x5y0");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,36), "G25x5y0");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(32,24), "G25x5y0");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(8,4), "G25x5y0");
    check_base_class_offset(lv, (E25x5*), 0, "G25x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G25x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G25x5y0.ff");
    test_class_info(&lv, &cd_G25x5y0);
    dp->~G25x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y0(Test_G25x5y0, "G25x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x5y0C1Ev();
extern void _ZN7G25x5y0D1Ev();
Name_Map name_map_G25x5y0[] = {
  NSPAIR(_ZN7G25x5y0C1Ev),
  NSPAIR(_ZN7G25x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G25x5y0[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y0[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y0[] = {
  {&(_ZTV7G25x5y0[4]),  4,12},
  {&(_tg__ZTV5E25x5__7G25x5y0[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y0[4]),  4,5},
  {&(_ZTV7G25x5y0[11]),  11,12},
  {&(_tg__ZTV3C25__7G25x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y0[];
extern  VTBL_ENTRY _ZTV7G25x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y0[];
Class_Descriptor cd_G25x5y0 = {  "G25x5y0", // class name
  bases_G25x5y0, 6,
  &(vtc_G25x5y0[0]), // expected_vtbl_contents
  &(vtt_G25x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y1  : virtual E25x5 , F1 {
  int ff;
  ~G25x5y1(); // tgen
  G25x5y1(); // tgen
};
//SIG(1 G25x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x5y1 ::~G25x5y1(){ note_dtor("G25x5y1", this);} // tgen
G25x5y1 ::G25x5y1(){ note_ctor("G25x5y1", this);} // tgen

static void Test_G25x5y1()
{
  extern Class_Descriptor cd_G25x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x5y1, buf);
    G25x5y1 *dp, &lv = *(dp=new (buf) G25x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y1)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,24), "G25x5y1");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,36), "G25x5y1");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(32,24), "G25x5y1");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(24,16), "G25x5y1");
    check_base_class_offset(lv, (E25x5*), ABISELECT(16,12), "G25x5y1");
    check_base_class_offset(lv, (F1*), 0, "G25x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x5y1.ff");
    test_class_info(&lv, &cd_G25x5y1);
    dp->~G25x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y1(Test_G25x5y1, "G25x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x5y1C1Ev();
extern void _ZN7G25x5y1D1Ev();
Name_Map name_map_G25x5y1[] = {
  NSPAIR(_ZN7G25x5y1C1Ev),
  NSPAIR(_ZN7G25x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G25x5y1[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y1[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y1[] = {
  {&(_ZTV7G25x5y1[5]),  5,15},
  {&(_ZTV7G25x5y1[10]),  10,15},
  {&(_ZTV7G25x5y1[14]),  14,15},
  {&(_tg__ZTV5E25x5__7G25x5y1[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y1[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y1[];
extern  VTBL_ENTRY _ZTV7G25x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y1[];
Class_Descriptor cd_G25x5y1 = {  "G25x5y1", // class name
  bases_G25x5y1, 6,
  &(vtc_G25x5y1[0]), // expected_vtbl_contents
  &(vtt_G25x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y1),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y2  : E25x5 , virtual F1 {
  int ff;
  ~G25x5y2(); // tgen
  G25x5y2(); // tgen
};
//SIG(1 G25x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x5y2 ::~G25x5y2(){ note_dtor("G25x5y2", this);} // tgen
G25x5y2 ::G25x5y2(){ note_ctor("G25x5y2", this);} // tgen

static void Test_G25x5y2()
{
  extern Class_Descriptor cd_G25x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x5y2, buf);
    G25x5y2 *dp, &lv = *(dp=new (buf) G25x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y2)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,16), "G25x5y2");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,28), "G25x5y2");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(24,16), "G25x5y2");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(8,4), "G25x5y2");
    check_base_class_offset(lv, (E25x5*), 0, "G25x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G25x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G25x5y2.ff");
    test_class_info(&lv, &cd_G25x5y2);
    dp->~G25x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y2(Test_G25x5y2, "G25x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G25x5y2C1Ev();
extern void _ZN7G25x5y2D1Ev();
Name_Map name_map_G25x5y2[] = {
  NSPAIR(_ZN7G25x5y2C1Ev),
  NSPAIR(_ZN7G25x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y2[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G25x5y2[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G25x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y2[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y2[] = {
  {&(_ZTV7G25x5y2[5]),  5,14},
  {&(_tg__ZTV5E25x5__7G25x5y2[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y2[4]),  4,5},
  {&(_ZTV7G25x5y2[9]),  9,14},
  {&(_ZTV7G25x5y2[13]),  13,14},
  {&(_tg__ZTV3C25__7G25x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y2[];
extern  VTBL_ENTRY _ZTV7G25x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y2[];
Class_Descriptor cd_G25x5y2 = {  "G25x5y2", // class name
  bases_G25x5y2, 6,
  &(vtc_G25x5y2[0]), // expected_vtbl_contents
  &(vtt_G25x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G25x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y3  : virtual E25x5 , virtual F1 {
  int ff;
  ~G25x5y3(); // tgen
  G25x5y3(); // tgen
};
//SIG(1 G25x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x5y3 ::~G25x5y3(){ note_dtor("G25x5y3", this);} // tgen
G25x5y3 ::G25x5y3(){ note_ctor("G25x5y3", this);} // tgen

static void Test_G25x5y3()
{
  extern Class_Descriptor cd_G25x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G25x5y3, buf);
    G25x5y3 *dp, &lv = *(dp=new (buf) G25x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G25x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y3)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x5y3");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x5y3");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(32,20), "G25x5y3");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(24,12), "G25x5y3");
    check_base_class_offset(lv, (E25x5*), ABISELECT(16,8), "G25x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G25x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x5y3.ff");
    test_class_info(&lv, &cd_G25x5y3);
    dp->~G25x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y3(Test_G25x5y3, "G25x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G25x5y3C1Ev();
extern void _ZN7G25x5y3D1Ev();
Name_Map name_map_G25x5y3[] = {
  NSPAIR(_ZN7G25x5y3C1Ev),
  NSPAIR(_ZN7G25x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y3[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G25x5y3[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G25x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y3[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y3[] = {
  {&(_ZTV7G25x5y3[6]),  6,19},
  {&(_ZTV7G25x5y3[10]),  10,19},
  {&(_ZTV7G25x5y3[14]),  14,19},
  {&(_ZTV7G25x5y3[18]),  18,19},
  {&(_tg__ZTV5E25x5__7G25x5y3[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y3[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y3[];
extern  VTBL_ENTRY _ZTV7G25x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y3[];
Class_Descriptor cd_G25x5y3 = {  "G25x5y3", // class name
  bases_G25x5y3, 6,
  &(vtc_G25x5y3[0]), // expected_vtbl_contents
  &(vtt_G25x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G25x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y3),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y4  : E25x5 , F0 {
  int ff;
  ~G25x5y4(); // tgen
  G25x5y4(); // tgen
};
//SIG(1 G25x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G25x5y4 ::~G25x5y4(){ note_dtor("G25x5y4", this);} // tgen
G25x5y4 ::G25x5y4(){ note_ctor("G25x5y4", this);} // tgen

static void Test_G25x5y4()
{
  extern Class_Descriptor cd_G25x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x5y4, buf);
    G25x5y4 *dp, &lv = *(dp=new (buf) G25x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y4)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,20), "G25x5y4");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,32), "G25x5y4");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(24,20), "G25x5y4");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(8,4), "G25x5y4");
    check_base_class_offset(lv, (E25x5*), 0, "G25x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G25x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G25x5y4.ff");
    test_class_info(&lv, &cd_G25x5y4);
    dp->~G25x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y4(Test_G25x5y4, "G25x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x5y4C1Ev();
extern void _ZN7G25x5y4D1Ev();
Name_Map name_map_G25x5y4[] = {
  NSPAIR(_ZN7G25x5y4C1Ev),
  NSPAIR(_ZN7G25x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G25x5y4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y4[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y4[] = {
  {&(_ZTV7G25x5y4[4]),  4,9},
  {&(_tg__ZTV5E25x5__7G25x5y4[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y4[4]),  4,5},
  {&(_ZTV7G25x5y4[8]),  8,9},
  {&(_tg__ZTV3C25__7G25x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y4[];
extern  VTBL_ENTRY _ZTV7G25x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y4[];
Class_Descriptor cd_G25x5y4 = {  "G25x5y4", // class name
  bases_G25x5y4, 6,
  &(vtc_G25x5y4[0]), // expected_vtbl_contents
  &(vtt_G25x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y5  : virtual E25x5 , F0 {
  int ff;
  ~G25x5y5(); // tgen
  G25x5y5(); // tgen
};
//SIG(1 G25x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G25x5y5 ::~G25x5y5(){ note_dtor("G25x5y5", this);} // tgen
G25x5y5 ::G25x5y5(){ note_ctor("G25x5y5", this);} // tgen

static void Test_G25x5y5()
{
  extern Class_Descriptor cd_G25x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x5y5, buf);
    G25x5y5 *dp, &lv = *(dp=new (buf) G25x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y5)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,24), "G25x5y5");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,36), "G25x5y5");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(32,24), "G25x5y5");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(24,16), "G25x5y5");
    check_base_class_offset(lv, (E25x5*), ABISELECT(16,12), "G25x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x5y5.ff");
    test_class_info(&lv, &cd_G25x5y5);
    dp->~G25x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y5(Test_G25x5y5, "G25x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x5y5C1Ev();
extern void _ZN7G25x5y5D1Ev();
Name_Map name_map_G25x5y5[] = {
  NSPAIR(_ZN7G25x5y5C1Ev),
  NSPAIR(_ZN7G25x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G25x5y5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y5[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y5[] = {
  {&(_ZTV7G25x5y5[5]),  5,14},
  {&(_ZTV7G25x5y5[9]),  9,14},
  {&(_ZTV7G25x5y5[13]),  13,14},
  {&(_tg__ZTV5E25x5__7G25x5y5[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y5[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y5[];
extern  VTBL_ENTRY _ZTV7G25x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y5[];
Class_Descriptor cd_G25x5y5 = {  "G25x5y5", // class name
  bases_G25x5y5, 6,
  &(vtc_G25x5y5[0]), // expected_vtbl_contents
  &(vtt_G25x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y5),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y6  : E25x5 , virtual F0 {
  int ff;
  ~G25x5y6(); // tgen
  G25x5y6(); // tgen
};
//SIG(1 G25x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x5y6 ::~G25x5y6(){ note_dtor("G25x5y6", this);} // tgen
G25x5y6 ::G25x5y6(){ note_ctor("G25x5y6", this);} // tgen

static void Test_G25x5y6()
{
  extern Class_Descriptor cd_G25x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x5y6, buf);
    G25x5y6 *dp, &lv = *(dp=new (buf) G25x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y6)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,16), "G25x5y6");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,28), "G25x5y6");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(24,16), "G25x5y6");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(8,4), "G25x5y6");
    check_base_class_offset(lv, (E25x5*), 0, "G25x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G25x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G25x5y6.ff");
    test_class_info(&lv, &cd_G25x5y6);
    dp->~G25x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y6(Test_G25x5y6, "G25x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x5y6C1Ev();
extern void _ZN7G25x5y6D1Ev();
Name_Map name_map_G25x5y6[] = {
  NSPAIR(_ZN7G25x5y6C1Ev),
  NSPAIR(_ZN7G25x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G25x5y6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y6[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y6[] = {
  {&(_ZTV7G25x5y6[5]),  5,10},
  {&(_tg__ZTV5E25x5__7G25x5y6[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y6[4]),  4,5},
  {&(_ZTV7G25x5y6[9]),  9,10},
  {&(_tg__ZTV3C25__7G25x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y6[];
extern  VTBL_ENTRY _ZTV7G25x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y6[];
Class_Descriptor cd_G25x5y6 = {  "G25x5y6", // class name
  bases_G25x5y6, 6,
  &(vtc_G25x5y6[0]), // expected_vtbl_contents
  &(vtt_G25x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x5y7  : virtual E25x5 , virtual F0 {
  int ff;
  ~G25x5y7(); // tgen
  G25x5y7(); // tgen
};
//SIG(1 G25x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x5y7 ::~G25x5y7(){ note_dtor("G25x5y7", this);} // tgen
G25x5y7 ::G25x5y7(){ note_ctor("G25x5y7", this);} // tgen

static void Test_G25x5y7()
{
  extern Class_Descriptor cd_G25x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x5y7, buf);
    G25x5y7 *dp, &lv = *(dp=new (buf) G25x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x5y7)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x5y7");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x5y7");
    check_base_class_offset(lv, (C25*)(E25x5*), ABISELECT(32,20), "G25x5y7");
    check_base_class_offset(lv, (D0*)(E25x5*), ABISELECT(24,12), "G25x5y7");
    check_base_class_offset(lv, (E25x5*), ABISELECT(16,8), "G25x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G25x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x5y7.ff");
    test_class_info(&lv, &cd_G25x5y7);
    dp->~G25x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x5y7(Test_G25x5y7, "G25x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x5y7C1Ev();
extern void _ZN7G25x5y7D1Ev();
Name_Map name_map_G25x5y7[] = {
  NSPAIR(_ZN7G25x5y7C1Ev),
  NSPAIR(_ZN7G25x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x5;
extern VTBL_ENTRY _ZTI5E25x5[];
extern  VTBL_ENTRY _ZTV5E25x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E25x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x5y7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G25x5y7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x5y7[];
static  VTBL_ENTRY _tg__ZTV5E25x5__7G25x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x5__7G25x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x5y7[] = {
  {&(_ZTV7G25x5y7[6]),  6,15},
  {&(_ZTV7G25x5y7[10]),  10,15},
  {&(_ZTV7G25x5y7[14]),  14,15},
  {&(_tg__ZTV5E25x5__7G25x5y7[4]),  4,4},
  {&(_tg__ZTV3C25__5E25x5__7G25x5y7[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x5y7[];
extern  VTBL_ENTRY _ZTV7G25x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x5y7[];
Class_Descriptor cd_G25x5y7 = {  "G25x5y7", // class name
  bases_G25x5y7, 6,
  &(vtc_G25x5y7[0]), // expected_vtbl_contents
  &(vtt_G25x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x5y7),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x5y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E26x5  : virtual C26 , D0 {
  int fd;
  ~E26x5(); // tgen
  E26x5(); // tgen
};
//SIG(-1 E26x5) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E26x5 ::~E26x5(){ note_dtor("E26x5", this);} // tgen
E26x5 ::E26x5(){ note_ctor("E26x5", this);} // tgen

static void Test_E26x5()
{
  extern Class_Descriptor cd_E26x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E26x5, buf);
    E26x5 *dp, &lv = *(dp=new (buf) E26x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E26x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x5)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,20), "E26x5");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,24), "E26x5");
    check_base_class_offset(lv, (C26*), ABISELECT(16,12), "E26x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E26x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E26x5.fd");
    test_class_info(&lv, &cd_E26x5);
    dp->~E26x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x5(Test_E26x5, "E26x5", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E26x5C1Ev();
extern void _ZN5E26x5D1Ev();
Name_Map name_map_E26x5[] = {
  NSPAIR(_ZN5E26x5C1Ev),
  NSPAIR(_ZN5E26x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E26x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E26x5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_E26x5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV5E26x5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x5[] = {
  {&(_ZTV5E26x5[5]),  5,11},
  {&(_ZTV5E26x5[10]),  10,11},
  {&(_tg__ZTV3C26__5E26x5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
Class_Descriptor cd_E26x5 = {  "E26x5", // class name
  bases_E26x5, 4,
  &(vtc_E26x5[0]), // expected_vtbl_contents
  &(vtt_E26x5[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E26x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E26x5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E26x5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y0  : E26x5 , F1 {
  int ff;
  ~G26x5y0(); // tgen
  G26x5y0(); // tgen
};
//SIG(1 G26x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x5y0 ::~G26x5y0(){ note_dtor("G26x5y0", this);} // tgen
G26x5y0 ::G26x5y0(){ note_ctor("G26x5y0", this);} // tgen

static void Test_G26x5y0()
{
  extern Class_Descriptor cd_G26x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x5y0, buf);
    G26x5y0 *dp, &lv = *(dp=new (buf) G26x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y0)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,32), "G26x5y0");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,36), "G26x5y0");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(32,24), "G26x5y0");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(8,4), "G26x5y0");
    check_base_class_offset(lv, (E26x5*), 0, "G26x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G26x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G26x5y0.ff");
    test_class_info(&lv, &cd_G26x5y0);
    dp->~G26x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y0(Test_G26x5y0, "G26x5y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x5y0C1Ev();
extern void _ZN7G26x5y0D1Ev();
Name_Map name_map_G26x5y0[] = {
  NSPAIR(_ZN7G26x5y0C1Ev),
  NSPAIR(_ZN7G26x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G26x5y0[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y0[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y0[] = {
  {&(_ZTV7G26x5y0[5]),  5,14},
  {&(_tg__ZTV5E26x5__7G26x5y0[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y0[5]),  5,6},
  {&(_ZTV7G26x5y0[13]),  13,14},
  {&(_tg__ZTV3C26__7G26x5y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y0[];
extern  VTBL_ENTRY _ZTV7G26x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y0[];
Class_Descriptor cd_G26x5y0 = {  "G26x5y0", // class name
  bases_G26x5y0, 6,
  &(vtc_G26x5y0[0]), // expected_vtbl_contents
  &(vtt_G26x5y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y0),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y1  : virtual E26x5 , F1 {
  int ff;
  ~G26x5y1(); // tgen
  G26x5y1(); // tgen
};
//SIG(1 G26x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x5y1 ::~G26x5y1(){ note_dtor("G26x5y1", this);} // tgen
G26x5y1 ::G26x5y1(){ note_ctor("G26x5y1", this);} // tgen

static void Test_G26x5y1()
{
  extern Class_Descriptor cd_G26x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x5y1, buf);
    G26x5y1 *dp, &lv = *(dp=new (buf) G26x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y1)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,32), "G26x5y1");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,36), "G26x5y1");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(32,24), "G26x5y1");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(24,16), "G26x5y1");
    check_base_class_offset(lv, (E26x5*), ABISELECT(16,12), "G26x5y1");
    check_base_class_offset(lv, (F1*), 0, "G26x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x5y1.ff");
    test_class_info(&lv, &cd_G26x5y1);
    dp->~G26x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y1(Test_G26x5y1, "G26x5y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x5y1C1Ev();
extern void _ZN7G26x5y1D1Ev();
Name_Map name_map_G26x5y1[] = {
  NSPAIR(_ZN7G26x5y1C1Ev),
  NSPAIR(_ZN7G26x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G26x5y1[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y1[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y1[] = {
  {&(_ZTV7G26x5y1[6]),  6,18},
  {&(_ZTV7G26x5y1[12]),  12,18},
  {&(_ZTV7G26x5y1[17]),  17,18},
  {&(_tg__ZTV5E26x5__7G26x5y1[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y1[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x5y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y1[];
extern  VTBL_ENTRY _ZTV7G26x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y1[];
Class_Descriptor cd_G26x5y1 = {  "G26x5y1", // class name
  bases_G26x5y1, 6,
  &(vtc_G26x5y1[0]), // expected_vtbl_contents
  &(vtt_G26x5y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y2  : E26x5 , virtual F1 {
  int ff;
  ~G26x5y2(); // tgen
  G26x5y2(); // tgen
};
//SIG(1 G26x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x5y2 ::~G26x5y2(){ note_dtor("G26x5y2", this);} // tgen
G26x5y2 ::G26x5y2(){ note_ctor("G26x5y2", this);} // tgen

static void Test_G26x5y2()
{
  extern Class_Descriptor cd_G26x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x5y2, buf);
    G26x5y2 *dp, &lv = *(dp=new (buf) G26x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y2)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,24), "G26x5y2");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,28), "G26x5y2");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(24,16), "G26x5y2");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(8,4), "G26x5y2");
    check_base_class_offset(lv, (E26x5*), 0, "G26x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G26x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x5y2.ff");
    test_class_info(&lv, &cd_G26x5y2);
    dp->~G26x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y2(Test_G26x5y2, "G26x5y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G26x5y2C1Ev();
extern void _ZN7G26x5y2D1Ev();
Name_Map name_map_G26x5y2[] = {
  NSPAIR(_ZN7G26x5y2C1Ev),
  NSPAIR(_ZN7G26x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y2[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x5y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G26x5y2[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G26x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y2[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y2[] = {
  {&(_ZTV7G26x5y2[6]),  6,16},
  {&(_tg__ZTV5E26x5__7G26x5y2[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y2[5]),  5,6},
  {&(_ZTV7G26x5y2[11]),  11,16},
  {&(_ZTV7G26x5y2[15]),  15,16},
  {&(_tg__ZTV3C26__7G26x5y2[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y2[];
extern  VTBL_ENTRY _ZTV7G26x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y2[];
Class_Descriptor cd_G26x5y2 = {  "G26x5y2", // class name
  bases_G26x5y2, 6,
  &(vtc_G26x5y2[0]), // expected_vtbl_contents
  &(vtt_G26x5y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G26x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y2),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y3  : virtual E26x5 , virtual F1 {
  int ff;
  ~G26x5y3(); // tgen
  G26x5y3(); // tgen
};
//SIG(1 G26x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x5y3 ::~G26x5y3(){ note_dtor("G26x5y3", this);} // tgen
G26x5y3 ::G26x5y3(){ note_ctor("G26x5y3", this);} // tgen

static void Test_G26x5y3()
{
  extern Class_Descriptor cd_G26x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G26x5y3, buf);
    G26x5y3 *dp, &lv = *(dp=new (buf) G26x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G26x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y3)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x5y3");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x5y3");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(32,20), "G26x5y3");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(24,12), "G26x5y3");
    check_base_class_offset(lv, (E26x5*), ABISELECT(16,8), "G26x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G26x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x5y3.ff");
    test_class_info(&lv, &cd_G26x5y3);
    dp->~G26x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y3(Test_G26x5y3, "G26x5y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G26x5y3C1Ev();
extern void _ZN7G26x5y3D1Ev();
Name_Map name_map_G26x5y3[] = {
  NSPAIR(_ZN7G26x5y3C1Ev),
  NSPAIR(_ZN7G26x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y3[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x5y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G26x5y3[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G26x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y3[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y3[] = {
  {&(_ZTV7G26x5y3[7]),  7,22},
  {&(_ZTV7G26x5y3[12]),  12,22},
  {&(_ZTV7G26x5y3[17]),  17,22},
  {&(_ZTV7G26x5y3[21]),  21,22},
  {&(_tg__ZTV5E26x5__7G26x5y3[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y3[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x5y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y3[];
extern  VTBL_ENTRY _ZTV7G26x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y3[];
Class_Descriptor cd_G26x5y3 = {  "G26x5y3", // class name
  bases_G26x5y3, 6,
  &(vtc_G26x5y3[0]), // expected_vtbl_contents
  &(vtt_G26x5y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G26x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y4  : E26x5 , F0 {
  int ff;
  ~G26x5y4(); // tgen
  G26x5y4(); // tgen
};
//SIG(1 G26x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G26x5y4 ::~G26x5y4(){ note_dtor("G26x5y4", this);} // tgen
G26x5y4 ::G26x5y4(){ note_ctor("G26x5y4", this);} // tgen

static void Test_G26x5y4()
{
  extern Class_Descriptor cd_G26x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x5y4, buf);
    G26x5y4 *dp, &lv = *(dp=new (buf) G26x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y4)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,28), "G26x5y4");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,32), "G26x5y4");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(24,20), "G26x5y4");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(8,4), "G26x5y4");
    check_base_class_offset(lv, (E26x5*), 0, "G26x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G26x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x5y4.ff");
    test_class_info(&lv, &cd_G26x5y4);
    dp->~G26x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y4(Test_G26x5y4, "G26x5y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x5y4C1Ev();
extern void _ZN7G26x5y4D1Ev();
Name_Map name_map_G26x5y4[] = {
  NSPAIR(_ZN7G26x5y4C1Ev),
  NSPAIR(_ZN7G26x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G26x5y4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y4[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y4[] = {
  {&(_ZTV7G26x5y4[5]),  5,11},
  {&(_tg__ZTV5E26x5__7G26x5y4[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y4[5]),  5,6},
  {&(_ZTV7G26x5y4[10]),  10,11},
  {&(_tg__ZTV3C26__7G26x5y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y4[];
extern  VTBL_ENTRY _ZTV7G26x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y4[];
Class_Descriptor cd_G26x5y4 = {  "G26x5y4", // class name
  bases_G26x5y4, 6,
  &(vtc_G26x5y4[0]), // expected_vtbl_contents
  &(vtt_G26x5y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y4),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y5  : virtual E26x5 , F0 {
  int ff;
  ~G26x5y5(); // tgen
  G26x5y5(); // tgen
};
//SIG(1 G26x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G26x5y5 ::~G26x5y5(){ note_dtor("G26x5y5", this);} // tgen
G26x5y5 ::G26x5y5(){ note_ctor("G26x5y5", this);} // tgen

static void Test_G26x5y5()
{
  extern Class_Descriptor cd_G26x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x5y5, buf);
    G26x5y5 *dp, &lv = *(dp=new (buf) G26x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y5)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,32), "G26x5y5");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,36), "G26x5y5");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(32,24), "G26x5y5");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(24,16), "G26x5y5");
    check_base_class_offset(lv, (E26x5*), ABISELECT(16,12), "G26x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x5y5.ff");
    test_class_info(&lv, &cd_G26x5y5);
    dp->~G26x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y5(Test_G26x5y5, "G26x5y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x5y5C1Ev();
extern void _ZN7G26x5y5D1Ev();
Name_Map name_map_G26x5y5[] = {
  NSPAIR(_ZN7G26x5y5C1Ev),
  NSPAIR(_ZN7G26x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G26x5y5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y5[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y5[] = {
  {&(_ZTV7G26x5y5[6]),  6,17},
  {&(_ZTV7G26x5y5[11]),  11,17},
  {&(_ZTV7G26x5y5[16]),  16,17},
  {&(_tg__ZTV5E26x5__7G26x5y5[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y5[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x5y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y5[];
extern  VTBL_ENTRY _ZTV7G26x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y5[];
Class_Descriptor cd_G26x5y5 = {  "G26x5y5", // class name
  bases_G26x5y5, 6,
  &(vtc_G26x5y5[0]), // expected_vtbl_contents
  &(vtt_G26x5y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y6  : E26x5 , virtual F0 {
  int ff;
  ~G26x5y6(); // tgen
  G26x5y6(); // tgen
};
//SIG(1 G26x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x5y6 ::~G26x5y6(){ note_dtor("G26x5y6", this);} // tgen
G26x5y6 ::G26x5y6(){ note_ctor("G26x5y6", this);} // tgen

static void Test_G26x5y6()
{
  extern Class_Descriptor cd_G26x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x5y6, buf);
    G26x5y6 *dp, &lv = *(dp=new (buf) G26x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y6)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,24), "G26x5y6");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,28), "G26x5y6");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(24,16), "G26x5y6");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(8,4), "G26x5y6");
    check_base_class_offset(lv, (E26x5*), 0, "G26x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G26x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x5y6.ff");
    test_class_info(&lv, &cd_G26x5y6);
    dp->~G26x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y6(Test_G26x5y6, "G26x5y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x5y6C1Ev();
extern void _ZN7G26x5y6D1Ev();
Name_Map name_map_G26x5y6[] = {
  NSPAIR(_ZN7G26x5y6C1Ev),
  NSPAIR(_ZN7G26x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x5y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G26x5y6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y6[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y6[] = {
  {&(_ZTV7G26x5y6[6]),  6,12},
  {&(_tg__ZTV5E26x5__7G26x5y6[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y6[5]),  5,6},
  {&(_ZTV7G26x5y6[11]),  11,12},
  {&(_tg__ZTV3C26__7G26x5y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y6[];
extern  VTBL_ENTRY _ZTV7G26x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y6[];
Class_Descriptor cd_G26x5y6 = {  "G26x5y6", // class name
  bases_G26x5y6, 6,
  &(vtc_G26x5y6[0]), // expected_vtbl_contents
  &(vtt_G26x5y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y6),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x5y7  : virtual E26x5 , virtual F0 {
  int ff;
  ~G26x5y7(); // tgen
  G26x5y7(); // tgen
};
//SIG(1 G26x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x5y7 ::~G26x5y7(){ note_dtor("G26x5y7", this);} // tgen
G26x5y7 ::G26x5y7(){ note_ctor("G26x5y7", this);} // tgen

static void Test_G26x5y7()
{
  extern Class_Descriptor cd_G26x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x5y7, buf);
    G26x5y7 *dp, &lv = *(dp=new (buf) G26x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x5y7)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x5y7");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x5y7");
    check_base_class_offset(lv, (C26*)(E26x5*), ABISELECT(32,20), "G26x5y7");
    check_base_class_offset(lv, (D0*)(E26x5*), ABISELECT(24,12), "G26x5y7");
    check_base_class_offset(lv, (E26x5*), ABISELECT(16,8), "G26x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G26x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x5y7.ff");
    test_class_info(&lv, &cd_G26x5y7);
    dp->~G26x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x5y7(Test_G26x5y7, "G26x5y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x5y7C1Ev();
extern void _ZN7G26x5y7D1Ev();
Name_Map name_map_G26x5y7[] = {
  NSPAIR(_ZN7G26x5y7C1Ev),
  NSPAIR(_ZN7G26x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x5;
extern VTBL_ENTRY _ZTI5E26x5[];
extern  VTBL_ENTRY _ZTV5E26x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E26x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x5y7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x5y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G26x5y7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x5y7[];
static  VTBL_ENTRY _tg__ZTV5E26x5__7G26x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x5__7G26x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x5y7[] = {
  {&(_ZTV7G26x5y7[7]),  7,18},
  {&(_ZTV7G26x5y7[12]),  12,18},
  {&(_ZTV7G26x5y7[17]),  17,18},
  {&(_tg__ZTV5E26x5__7G26x5y7[5]),  5,5},
  {&(_tg__ZTV3C26__5E26x5__7G26x5y7[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x5y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x5y7[];
extern  VTBL_ENTRY _ZTV7G26x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x5y7[];
Class_Descriptor cd_G26x5y7 = {  "G26x5y7", // class name
  bases_G26x5y7, 6,
  &(vtc_G26x5y7[0]), // expected_vtbl_contents
  &(vtt_G26x5y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x5y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x5y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E27x5  : virtual C27 , D0 {
  int fd;
  ~E27x5(); // tgen
  E27x5(); // tgen
};
//SIG(-1 E27x5) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} BC5{ Fi} Fi}


E27x5 ::~E27x5(){ note_dtor("E27x5", this);} // tgen
E27x5 ::E27x5(){ note_ctor("E27x5", this);} // tgen

static void Test_E27x5()
{
  extern Class_Descriptor cd_E27x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E27x5, buf);
    E27x5 *dp, &lv = *(dp=new (buf) E27x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E27x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x5)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,20), "E27x5");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,28), "E27x5");
    check_base_class_offset(lv, (C27*), ABISELECT(16,12), "E27x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E27x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E27x5.fd");
    test_class_info(&lv, &cd_E27x5);
    dp->~E27x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x5(Test_E27x5, "E27x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E27x5C1Ev();
extern void _ZN5E27x5D1Ev();
Name_Map name_map_E27x5[] = {
  NSPAIR(_ZN5E27x5C1Ev),
  NSPAIR(_ZN5E27x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E27x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E27x5[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV5E27x5[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__5E27x5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x5[] = {
  {&(_ZTV5E27x5[5]),  5,15},
  {&(_ZTV5E27x5[10]),  10,15},
  {&(_ZTV5E27x5[14]),  14,15},
  {&(_tg__ZTV3C27__5E27x5[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__5E27x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
static VTBL_ENTRY alt_thunk_names89[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x5 = {  "E27x5", // class name
  bases_E27x5, 4,
  &(vtc_E27x5[0]), // expected_vtbl_contents
  &(vtt_E27x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E27x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E27x5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E27x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names89,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y0  : E27x5 , F1 {
  int ff;
  ~G27x5y0(); // tgen
  G27x5y0(); // tgen
};
//SIG(1 G27x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x5y0 ::~G27x5y0(){ note_dtor("G27x5y0", this);} // tgen
G27x5y0 ::G27x5y0(){ note_ctor("G27x5y0", this);} // tgen

static void Test_G27x5y0()
{
  extern Class_Descriptor cd_G27x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G27x5y0, buf);
    G27x5y0 *dp, &lv = *(dp=new (buf) G27x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G27x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y0)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,32), "G27x5y0");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,40), "G27x5y0");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(32,24), "G27x5y0");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(8,4), "G27x5y0");
    check_base_class_offset(lv, (E27x5*), 0, "G27x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G27x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G27x5y0.ff");
    test_class_info(&lv, &cd_G27x5y0);
    dp->~G27x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y0(Test_G27x5y0, "G27x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G27x5y0C1Ev();
extern void _ZN7G27x5y0D1Ev();
Name_Map name_map_G27x5y0[] = {
  NSPAIR(_ZN7G27x5y0C1Ev),
  NSPAIR(_ZN7G27x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x5y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x5y0[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G27x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x5y0[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y0[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y0[] = {
  {&(_ZTV7G27x5y0[5]),  5,18},
  {&(_tg__ZTV5E27x5__7G27x5y0[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y0[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y0[3]),  3,4},
  {&(_ZTV7G27x5y0[13]),  13,18},
  {&(_ZTV7G27x5y0[17]),  17,18},
  {&(_tg__ZTV3C27__7G27x5y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y0[];
extern  VTBL_ENTRY _ZTV7G27x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y0[];
static VTBL_ENTRY alt_thunk_names90[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y0 = {  "G27x5y0", // class name
  bases_G27x5y0, 6,
  &(vtc_G27x5y0[0]), // expected_vtbl_contents
  &(vtt_G27x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G27x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names90,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y1  : virtual E27x5 , F1 {
  int ff;
  ~G27x5y1(); // tgen
  G27x5y1(); // tgen
};
//SIG(1 G27x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x5y1 ::~G27x5y1(){ note_dtor("G27x5y1", this);} // tgen
G27x5y1 ::G27x5y1(){ note_ctor("G27x5y1", this);} // tgen

static void Test_G27x5y1()
{
  extern Class_Descriptor cd_G27x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G27x5y1, buf);
    G27x5y1 *dp, &lv = *(dp=new (buf) G27x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G27x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y1)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,32), "G27x5y1");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,40), "G27x5y1");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(32,24), "G27x5y1");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(24,16), "G27x5y1");
    check_base_class_offset(lv, (E27x5*), ABISELECT(16,12), "G27x5y1");
    check_base_class_offset(lv, (F1*), 0, "G27x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x5y1.ff");
    test_class_info(&lv, &cd_G27x5y1);
    dp->~G27x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y1(Test_G27x5y1, "G27x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G27x5y1C1Ev();
extern void _ZN7G27x5y1D1Ev();
Name_Map name_map_G27x5y1[] = {
  NSPAIR(_ZN7G27x5y1C1Ev),
  NSPAIR(_ZN7G27x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x5y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x5y1[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x5y1[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G27x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x5y1[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y1[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y1[] = {
  {&(_ZTV7G27x5y1[6]),  6,22},
  {&(_ZTV7G27x5y1[12]),  12,22},
  {&(_ZTV7G27x5y1[17]),  17,22},
  {&(_ZTV7G27x5y1[21]),  21,22},
  {&(_tg__ZTV5E27x5__7G27x5y1[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y1[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y1[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x5y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y1[];
extern  VTBL_ENTRY _ZTV7G27x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y1[];
static VTBL_ENTRY alt_thunk_names91[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y1 = {  "G27x5y1", // class name
  bases_G27x5y1, 6,
  &(vtc_G27x5y1[0]), // expected_vtbl_contents
  &(vtt_G27x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G27x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names91,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y2  : E27x5 , virtual F1 {
  int ff;
  ~G27x5y2(); // tgen
  G27x5y2(); // tgen
};
//SIG(1 G27x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x5y2 ::~G27x5y2(){ note_dtor("G27x5y2", this);} // tgen
G27x5y2 ::G27x5y2(){ note_ctor("G27x5y2", this);} // tgen

static void Test_G27x5y2()
{
  extern Class_Descriptor cd_G27x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x5y2, buf);
    G27x5y2 *dp, &lv = *(dp=new (buf) G27x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y2)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,24), "G27x5y2");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,32), "G27x5y2");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(24,16), "G27x5y2");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(8,4), "G27x5y2");
    check_base_class_offset(lv, (E27x5*), 0, "G27x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x5y2.ff");
    test_class_info(&lv, &cd_G27x5y2);
    dp->~G27x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y2(Test_G27x5y2, "G27x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x5y2C1Ev();
extern void _ZN7G27x5y2D1Ev();
Name_Map name_map_G27x5y2[] = {
  NSPAIR(_ZN7G27x5y2C1Ev),
  NSPAIR(_ZN7G27x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y2[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y2[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G27x5y2[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G27x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G27x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x5y2[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y2[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y2[] = {
  {&(_ZTV7G27x5y2[6]),  6,20},
  {&(_tg__ZTV5E27x5__7G27x5y2[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y2[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y2[3]),  3,4},
  {&(_ZTV7G27x5y2[11]),  11,20},
  {&(_ZTV7G27x5y2[15]),  15,20},
  {&(_ZTV7G27x5y2[19]),  19,20},
  {&(_tg__ZTV3C27__7G27x5y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y2[];
extern  VTBL_ENTRY _ZTV7G27x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y2[];
static VTBL_ENTRY alt_thunk_names92[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y2 = {  "G27x5y2", // class name
  bases_G27x5y2, 6,
  &(vtc_G27x5y2[0]), // expected_vtbl_contents
  &(vtt_G27x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names92,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y3  : virtual E27x5 , virtual F1 {
  int ff;
  ~G27x5y3(); // tgen
  G27x5y3(); // tgen
};
//SIG(1 G27x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x5y3 ::~G27x5y3(){ note_dtor("G27x5y3", this);} // tgen
G27x5y3 ::G27x5y3(){ note_ctor("G27x5y3", this);} // tgen

static void Test_G27x5y3()
{
  extern Class_Descriptor cd_G27x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G27x5y3, buf);
    G27x5y3 *dp, &lv = *(dp=new (buf) G27x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G27x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y3)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x5y3");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x5y3");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(32,20), "G27x5y3");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(24,12), "G27x5y3");
    check_base_class_offset(lv, (E27x5*), ABISELECT(16,8), "G27x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G27x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x5y3.ff");
    test_class_info(&lv, &cd_G27x5y3);
    dp->~G27x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y3(Test_G27x5y3, "G27x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G27x5y3C1Ev();
extern void _ZN7G27x5y3D1Ev();
Name_Map name_map_G27x5y3[] = {
  NSPAIR(_ZN7G27x5y3C1Ev),
  NSPAIR(_ZN7G27x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y3[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x5y3[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x5y3[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G27x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G27x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x5y3[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y3[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y3[] = {
  {&(_ZTV7G27x5y3[7]),  7,26},
  {&(_ZTV7G27x5y3[12]),  12,26},
  {&(_ZTV7G27x5y3[17]),  17,26},
  {&(_ZTV7G27x5y3[21]),  21,26},
  {&(_ZTV7G27x5y3[25]),  25,26},
  {&(_tg__ZTV5E27x5__7G27x5y3[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y3[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y3[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x5y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y3[];
extern  VTBL_ENTRY _ZTV7G27x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y3[];
static VTBL_ENTRY alt_thunk_names93[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y3 = {  "G27x5y3", // class name
  bases_G27x5y3, 6,
  &(vtc_G27x5y3[0]), // expected_vtbl_contents
  &(vtt_G27x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G27x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names93,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y4  : E27x5 , F0 {
  int ff;
  ~G27x5y4(); // tgen
  G27x5y4(); // tgen
};
//SIG(1 G27x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G27x5y4 ::~G27x5y4(){ note_dtor("G27x5y4", this);} // tgen
G27x5y4 ::G27x5y4(){ note_ctor("G27x5y4", this);} // tgen

static void Test_G27x5y4()
{
  extern Class_Descriptor cd_G27x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x5y4, buf);
    G27x5y4 *dp, &lv = *(dp=new (buf) G27x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y4)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,28), "G27x5y4");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,36), "G27x5y4");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(24,20), "G27x5y4");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(8,4), "G27x5y4");
    check_base_class_offset(lv, (E27x5*), 0, "G27x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G27x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x5y4.ff");
    test_class_info(&lv, &cd_G27x5y4);
    dp->~G27x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y4(Test_G27x5y4, "G27x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x5y4C1Ev();
extern void _ZN7G27x5y4D1Ev();
Name_Map name_map_G27x5y4[] = {
  NSPAIR(_ZN7G27x5y4C1Ev),
  NSPAIR(_ZN7G27x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y4[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x5y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y4[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G27x5y4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G27x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x5y4[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y4[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y4[] = {
  {&(_ZTV7G27x5y4[5]),  5,15},
  {&(_tg__ZTV5E27x5__7G27x5y4[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y4[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y4[3]),  3,4},
  {&(_ZTV7G27x5y4[10]),  10,15},
  {&(_ZTV7G27x5y4[14]),  14,15},
  {&(_tg__ZTV3C27__7G27x5y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y4[];
extern  VTBL_ENTRY _ZTV7G27x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y4[];
static VTBL_ENTRY alt_thunk_names94[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y4 = {  "G27x5y4", // class name
  bases_G27x5y4, 6,
  &(vtc_G27x5y4[0]), // expected_vtbl_contents
  &(vtt_G27x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names94,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y5  : virtual E27x5 , F0 {
  int ff;
  ~G27x5y5(); // tgen
  G27x5y5(); // tgen
};
//SIG(1 G27x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G27x5y5 ::~G27x5y5(){ note_dtor("G27x5y5", this);} // tgen
G27x5y5 ::G27x5y5(){ note_ctor("G27x5y5", this);} // tgen

static void Test_G27x5y5()
{
  extern Class_Descriptor cd_G27x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G27x5y5, buf);
    G27x5y5 *dp, &lv = *(dp=new (buf) G27x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G27x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y5)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,32), "G27x5y5");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,40), "G27x5y5");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(32,24), "G27x5y5");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(24,16), "G27x5y5");
    check_base_class_offset(lv, (E27x5*), ABISELECT(16,12), "G27x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x5y5.ff");
    test_class_info(&lv, &cd_G27x5y5);
    dp->~G27x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y5(Test_G27x5y5, "G27x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G27x5y5C1Ev();
extern void _ZN7G27x5y5D1Ev();
Name_Map name_map_G27x5y5[] = {
  NSPAIR(_ZN7G27x5y5C1Ev),
  NSPAIR(_ZN7G27x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y5[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x5y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x5y5[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x5y5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G27x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x5y5[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y5[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y5[] = {
  {&(_ZTV7G27x5y5[6]),  6,21},
  {&(_ZTV7G27x5y5[11]),  11,21},
  {&(_ZTV7G27x5y5[16]),  16,21},
  {&(_ZTV7G27x5y5[20]),  20,21},
  {&(_tg__ZTV5E27x5__7G27x5y5[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y5[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y5[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x5y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y5[];
extern  VTBL_ENTRY _ZTV7G27x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y5[];
static VTBL_ENTRY alt_thunk_names95[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y5 = {  "G27x5y5", // class name
  bases_G27x5y5, 6,
  &(vtc_G27x5y5[0]), // expected_vtbl_contents
  &(vtt_G27x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G27x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names95,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y6  : E27x5 , virtual F0 {
  int ff;
  ~G27x5y6(); // tgen
  G27x5y6(); // tgen
};
//SIG(1 G27x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x5y6 ::~G27x5y6(){ note_dtor("G27x5y6", this);} // tgen
G27x5y6 ::G27x5y6(){ note_ctor("G27x5y6", this);} // tgen

static void Test_G27x5y6()
{
  extern Class_Descriptor cd_G27x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x5y6, buf);
    G27x5y6 *dp, &lv = *(dp=new (buf) G27x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y6)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,24), "G27x5y6");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,32), "G27x5y6");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(24,16), "G27x5y6");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(8,4), "G27x5y6");
    check_base_class_offset(lv, (E27x5*), 0, "G27x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G27x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x5y6.ff");
    test_class_info(&lv, &cd_G27x5y6);
    dp->~G27x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y6(Test_G27x5y6, "G27x5y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G27x5y6C1Ev();
extern void _ZN7G27x5y6D1Ev();
Name_Map name_map_G27x5y6[] = {
  NSPAIR(_ZN7G27x5y6C1Ev),
  NSPAIR(_ZN7G27x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y6[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x5y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y6[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G27x5y6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G27x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x5y6[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y6[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y6[] = {
  {&(_ZTV7G27x5y6[6]),  6,16},
  {&(_tg__ZTV5E27x5__7G27x5y6[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y6[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y6[3]),  3,4},
  {&(_ZTV7G27x5y6[11]),  11,16},
  {&(_ZTV7G27x5y6[15]),  15,16},
  {&(_tg__ZTV3C27__7G27x5y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y6[];
extern  VTBL_ENTRY _ZTV7G27x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y6[];
static VTBL_ENTRY alt_thunk_names96[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y6 = {  "G27x5y6", // class name
  bases_G27x5y6, 6,
  &(vtc_G27x5y6[0]), // expected_vtbl_contents
  &(vtt_G27x5y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G27x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names96,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x5y7  : virtual E27x5 , virtual F0 {
  int ff;
  ~G27x5y7(); // tgen
  G27x5y7(); // tgen
};
//SIG(1 G27x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x5y7 ::~G27x5y7(){ note_dtor("G27x5y7", this);} // tgen
G27x5y7 ::G27x5y7(){ note_ctor("G27x5y7", this);} // tgen

static void Test_G27x5y7()
{
  extern Class_Descriptor cd_G27x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x5y7, buf);
    G27x5y7 *dp, &lv = *(dp=new (buf) G27x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x5y7)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x5y7");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x5y7");
    check_base_class_offset(lv, (C27*)(E27x5*), ABISELECT(32,20), "G27x5y7");
    check_base_class_offset(lv, (D0*)(E27x5*), ABISELECT(24,12), "G27x5y7");
    check_base_class_offset(lv, (E27x5*), ABISELECT(16,8), "G27x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G27x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x5y7.ff");
    test_class_info(&lv, &cd_G27x5y7);
    dp->~G27x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x5y7(Test_G27x5y7, "G27x5y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x5y7C1Ev();
extern void _ZN7G27x5y7D1Ev();
Name_Map name_map_G27x5y7[] = {
  NSPAIR(_ZN7G27x5y7C1Ev),
  NSPAIR(_ZN7G27x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x5;
extern VTBL_ENTRY _ZTI5E27x5[];
extern  VTBL_ENTRY _ZTV5E27x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E27x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x5y7[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x5y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x5y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x5y7[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x5y7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G27x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x5y7[];
static  VTBL_ENTRY _tg__ZTV5E27x5__7G27x5y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x5__7G27x5y7[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x5__7G27x5y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x5y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x5y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x5y7[] = {
  {&(_ZTV7G27x5y7[7]),  7,22},
  {&(_ZTV7G27x5y7[12]),  12,22},
  {&(_ZTV7G27x5y7[17]),  17,22},
  {&(_ZTV7G27x5y7[21]),  21,22},
  {&(_tg__ZTV5E27x5__7G27x5y7[5]),  5,5},
  {&(_tg__ZTV3C27__5E27x5__7G27x5y7[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x5__7G27x5y7[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x5y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x5y7[];
extern  VTBL_ENTRY _ZTV7G27x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x5y7[];
static VTBL_ENTRY alt_thunk_names97[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x5y7 = {  "G27x5y7", // class name
  bases_G27x5y7, 6,
  &(vtc_G27x5y7[0]), // expected_vtbl_contents
  &(vtt_G27x5y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x5y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names97,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x5  : virtual C28 , D0 {
  int fd;
  ~E28x5(); // tgen
  E28x5(); // tgen
};
//SIG(-1 E28x5) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E28x5 ::~E28x5(){ note_dtor("E28x5", this);} // tgen
E28x5 ::E28x5(){ note_ctor("E28x5", this);} // tgen

static void Test_E28x5()
{
  extern Class_Descriptor cd_E28x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E28x5, buf);
    E28x5 *dp, &lv = *(dp=new (buf) E28x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E28x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x5)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,16), "E28x5");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,24), "E28x5");
    check_base_class_offset(lv, (C28*), ABISELECT(16,12), "E28x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E28x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E28x5.fd");
    test_class_info(&lv, &cd_E28x5);
    dp->~E28x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x5(Test_E28x5, "E28x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E28x5C1Ev();
extern void _ZN5E28x5D1Ev();
Name_Map name_map_E28x5[] = {
  NSPAIR(_ZN5E28x5C1Ev),
  NSPAIR(_ZN5E28x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E28x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E28x5[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV5E28x5[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__5E28x5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x5[] = {
  {&(_ZTV5E28x5[4]),  4,13},
  {&(_ZTV5E28x5[8]),  8,13},
  {&(_ZTV5E28x5[12]),  12,13},
  {&(_tg__ZTV3C28__5E28x5[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__5E28x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
static VTBL_ENTRY alt_thunk_names98[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x5 = {  "E28x5", // class name
  bases_E28x5, 4,
  &(vtc_E28x5[0]), // expected_vtbl_contents
  &(vtt_E28x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E28x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E28x5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E28x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names98,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y0  : E28x5 , F1 {
  int ff;
  ~G28x5y0(); // tgen
  G28x5y0(); // tgen
};
//SIG(1 G28x5y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x5y0 ::~G28x5y0(){ note_dtor("G28x5y0", this);} // tgen
G28x5y0 ::G28x5y0(){ note_ctor("G28x5y0", this);} // tgen

static void Test_G28x5y0()
{
  extern Class_Descriptor cd_G28x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x5y0, buf);
    G28x5y0 *dp, &lv = *(dp=new (buf) G28x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y0)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,28), "G28x5y0");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,36), "G28x5y0");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(32,24), "G28x5y0");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(8,4), "G28x5y0");
    check_base_class_offset(lv, (E28x5*), 0, "G28x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G28x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G28x5y0.ff");
    test_class_info(&lv, &cd_G28x5y0);
    dp->~G28x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y0(Test_G28x5y0, "G28x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x5y0C1Ev();
extern void _ZN7G28x5y0D1Ev();
Name_Map name_map_G28x5y0[] = {
  NSPAIR(_ZN7G28x5y0C1Ev),
  NSPAIR(_ZN7G28x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x5y0[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G28x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x5y0[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y0[] = {
  {&(_ZTV7G28x5y0[4]),  4,16},
  {&(_tg__ZTV5E28x5__7G28x5y0[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y0[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y0[3]),  3,4},
  {&(_ZTV7G28x5y0[11]),  11,16},
  {&(_ZTV7G28x5y0[15]),  15,16},
  {&(_tg__ZTV3C28__7G28x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y0[];
extern  VTBL_ENTRY _ZTV7G28x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y0[];
static VTBL_ENTRY alt_thunk_names99[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y0 = {  "G28x5y0", // class name
  bases_G28x5y0, 6,
  &(vtc_G28x5y0[0]), // expected_vtbl_contents
  &(vtt_G28x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names99,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y1  : virtual E28x5 , F1 {
  int ff;
  ~G28x5y1(); // tgen
  G28x5y1(); // tgen
};
//SIG(1 G28x5y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x5y1 ::~G28x5y1(){ note_dtor("G28x5y1", this);} // tgen
G28x5y1 ::G28x5y1(){ note_ctor("G28x5y1", this);} // tgen

static void Test_G28x5y1()
{
  extern Class_Descriptor cd_G28x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x5y1, buf);
    G28x5y1 *dp, &lv = *(dp=new (buf) G28x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y1)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,28), "G28x5y1");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,36), "G28x5y1");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(32,24), "G28x5y1");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(24,16), "G28x5y1");
    check_base_class_offset(lv, (E28x5*), ABISELECT(16,12), "G28x5y1");
    check_base_class_offset(lv, (F1*), 0, "G28x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x5y1.ff");
    test_class_info(&lv, &cd_G28x5y1);
    dp->~G28x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y1(Test_G28x5y1, "G28x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x5y1C1Ev();
extern void _ZN7G28x5y1D1Ev();
Name_Map name_map_G28x5y1[] = {
  NSPAIR(_ZN7G28x5y1C1Ev),
  NSPAIR(_ZN7G28x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x5y1[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G28x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x5y1[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y1[] = {
  {&(_ZTV7G28x5y1[5]),  5,19},
  {&(_ZTV7G28x5y1[10]),  10,19},
  {&(_ZTV7G28x5y1[14]),  14,19},
  {&(_ZTV7G28x5y1[18]),  18,19},
  {&(_tg__ZTV5E28x5__7G28x5y1[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y1[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y1[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y1[];
extern  VTBL_ENTRY _ZTV7G28x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y1[];
static VTBL_ENTRY alt_thunk_names100[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y1 = {  "G28x5y1", // class name
  bases_G28x5y1, 6,
  &(vtc_G28x5y1[0]), // expected_vtbl_contents
  &(vtt_G28x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names100,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y2  : E28x5 , virtual F1 {
  int ff;
  ~G28x5y2(); // tgen
  G28x5y2(); // tgen
};
//SIG(1 G28x5y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x5y2 ::~G28x5y2(){ note_dtor("G28x5y2", this);} // tgen
G28x5y2 ::G28x5y2(){ note_ctor("G28x5y2", this);} // tgen

static void Test_G28x5y2()
{
  extern Class_Descriptor cd_G28x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x5y2, buf);
    G28x5y2 *dp, &lv = *(dp=new (buf) G28x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y2)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,20), "G28x5y2");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,28), "G28x5y2");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(24,16), "G28x5y2");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(8,4), "G28x5y2");
    check_base_class_offset(lv, (E28x5*), 0, "G28x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G28x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G28x5y2.ff");
    test_class_info(&lv, &cd_G28x5y2);
    dp->~G28x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y2(Test_G28x5y2, "G28x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G28x5y2C1Ev();
extern void _ZN7G28x5y2D1Ev();
Name_Map name_map_G28x5y2[] = {
  NSPAIR(_ZN7G28x5y2C1Ev),
  NSPAIR(_ZN7G28x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y2[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G28x5y2[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G28x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x5y2[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y2[] = {
  {&(_ZTV7G28x5y2[5]),  5,18},
  {&(_tg__ZTV5E28x5__7G28x5y2[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y2[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y2[3]),  3,4},
  {&(_ZTV7G28x5y2[9]),  9,18},
  {&(_ZTV7G28x5y2[13]),  13,18},
  {&(_ZTV7G28x5y2[17]),  17,18},
  {&(_tg__ZTV3C28__7G28x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y2[];
extern  VTBL_ENTRY _ZTV7G28x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y2[];
static VTBL_ENTRY alt_thunk_names101[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y2 = {  "G28x5y2", // class name
  bases_G28x5y2, 6,
  &(vtc_G28x5y2[0]), // expected_vtbl_contents
  &(vtt_G28x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G28x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names101,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y3  : virtual E28x5 , virtual F1 {
  int ff;
  ~G28x5y3(); // tgen
  G28x5y3(); // tgen
};
//SIG(1 G28x5y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x5y3 ::~G28x5y3(){ note_dtor("G28x5y3", this);} // tgen
G28x5y3 ::G28x5y3(){ note_ctor("G28x5y3", this);} // tgen

static void Test_G28x5y3()
{
  extern Class_Descriptor cd_G28x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G28x5y3, buf);
    G28x5y3 *dp, &lv = *(dp=new (buf) G28x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G28x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y3)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x5y3");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x5y3");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(32,20), "G28x5y3");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(24,12), "G28x5y3");
    check_base_class_offset(lv, (E28x5*), ABISELECT(16,8), "G28x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G28x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x5y3.ff");
    test_class_info(&lv, &cd_G28x5y3);
    dp->~G28x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y3(Test_G28x5y3, "G28x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G28x5y3C1Ev();
extern void _ZN7G28x5y3D1Ev();
Name_Map name_map_G28x5y3[] = {
  NSPAIR(_ZN7G28x5y3C1Ev),
  NSPAIR(_ZN7G28x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y3[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G28x5y3[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G28x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G28x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x5y3[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y3[] = {
  {&(_ZTV7G28x5y3[6]),  6,23},
  {&(_ZTV7G28x5y3[10]),  10,23},
  {&(_ZTV7G28x5y3[14]),  14,23},
  {&(_ZTV7G28x5y3[18]),  18,23},
  {&(_ZTV7G28x5y3[22]),  22,23},
  {&(_tg__ZTV5E28x5__7G28x5y3[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y3[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y3[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y3[];
extern  VTBL_ENTRY _ZTV7G28x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y3[];
static VTBL_ENTRY alt_thunk_names102[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y3 = {  "G28x5y3", // class name
  bases_G28x5y3, 6,
  &(vtc_G28x5y3[0]), // expected_vtbl_contents
  &(vtt_G28x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G28x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names102,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y4  : E28x5 , F0 {
  int ff;
  ~G28x5y4(); // tgen
  G28x5y4(); // tgen
};
//SIG(1 G28x5y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G28x5y4 ::~G28x5y4(){ note_dtor("G28x5y4", this);} // tgen
G28x5y4 ::G28x5y4(){ note_ctor("G28x5y4", this);} // tgen

static void Test_G28x5y4()
{
  extern Class_Descriptor cd_G28x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x5y4, buf);
    G28x5y4 *dp, &lv = *(dp=new (buf) G28x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y4)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,24), "G28x5y4");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,32), "G28x5y4");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(24,20), "G28x5y4");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(8,4), "G28x5y4");
    check_base_class_offset(lv, (E28x5*), 0, "G28x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G28x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G28x5y4.ff");
    test_class_info(&lv, &cd_G28x5y4);
    dp->~G28x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y4(Test_G28x5y4, "G28x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x5y4C1Ev();
extern void _ZN7G28x5y4D1Ev();
Name_Map name_map_G28x5y4[] = {
  NSPAIR(_ZN7G28x5y4C1Ev),
  NSPAIR(_ZN7G28x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y4[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G28x5y4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G28x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x5y4[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y4[] = {
  {&(_ZTV7G28x5y4[4]),  4,13},
  {&(_tg__ZTV5E28x5__7G28x5y4[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y4[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y4[3]),  3,4},
  {&(_ZTV7G28x5y4[8]),  8,13},
  {&(_ZTV7G28x5y4[12]),  12,13},
  {&(_tg__ZTV3C28__7G28x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y4[];
extern  VTBL_ENTRY _ZTV7G28x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y4[];
static VTBL_ENTRY alt_thunk_names103[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y4 = {  "G28x5y4", // class name
  bases_G28x5y4, 6,
  &(vtc_G28x5y4[0]), // expected_vtbl_contents
  &(vtt_G28x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names103,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y5  : virtual E28x5 , F0 {
  int ff;
  ~G28x5y5(); // tgen
  G28x5y5(); // tgen
};
//SIG(1 G28x5y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G28x5y5 ::~G28x5y5(){ note_dtor("G28x5y5", this);} // tgen
G28x5y5 ::G28x5y5(){ note_ctor("G28x5y5", this);} // tgen

static void Test_G28x5y5()
{
  extern Class_Descriptor cd_G28x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x5y5, buf);
    G28x5y5 *dp, &lv = *(dp=new (buf) G28x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y5)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,28), "G28x5y5");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,36), "G28x5y5");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(32,24), "G28x5y5");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(24,16), "G28x5y5");
    check_base_class_offset(lv, (E28x5*), ABISELECT(16,12), "G28x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x5y5.ff");
    test_class_info(&lv, &cd_G28x5y5);
    dp->~G28x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y5(Test_G28x5y5, "G28x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x5y5C1Ev();
extern void _ZN7G28x5y5D1Ev();
Name_Map name_map_G28x5y5[] = {
  NSPAIR(_ZN7G28x5y5C1Ev),
  NSPAIR(_ZN7G28x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y5[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x5y5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G28x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x5y5[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y5[] = {
  {&(_ZTV7G28x5y5[5]),  5,18},
  {&(_ZTV7G28x5y5[9]),  9,18},
  {&(_ZTV7G28x5y5[13]),  13,18},
  {&(_ZTV7G28x5y5[17]),  17,18},
  {&(_tg__ZTV5E28x5__7G28x5y5[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y5[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y5[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y5[];
extern  VTBL_ENTRY _ZTV7G28x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y5[];
static VTBL_ENTRY alt_thunk_names104[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y5 = {  "G28x5y5", // class name
  bases_G28x5y5, 6,
  &(vtc_G28x5y5[0]), // expected_vtbl_contents
  &(vtt_G28x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names104,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y6  : E28x5 , virtual F0 {
  int ff;
  ~G28x5y6(); // tgen
  G28x5y6(); // tgen
};
//SIG(1 G28x5y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x5y6 ::~G28x5y6(){ note_dtor("G28x5y6", this);} // tgen
G28x5y6 ::G28x5y6(){ note_ctor("G28x5y6", this);} // tgen

static void Test_G28x5y6()
{
  extern Class_Descriptor cd_G28x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x5y6, buf);
    G28x5y6 *dp, &lv = *(dp=new (buf) G28x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y6)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,20), "G28x5y6");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,28), "G28x5y6");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(24,16), "G28x5y6");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(8,4), "G28x5y6");
    check_base_class_offset(lv, (E28x5*), 0, "G28x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G28x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G28x5y6.ff");
    test_class_info(&lv, &cd_G28x5y6);
    dp->~G28x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y6(Test_G28x5y6, "G28x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x5y6C1Ev();
extern void _ZN7G28x5y6D1Ev();
Name_Map name_map_G28x5y6[] = {
  NSPAIR(_ZN7G28x5y6C1Ev),
  NSPAIR(_ZN7G28x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y6[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G28x5y6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x5y6[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y6[] = {
  {&(_ZTV7G28x5y6[5]),  5,14},
  {&(_tg__ZTV5E28x5__7G28x5y6[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y6[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y6[3]),  3,4},
  {&(_ZTV7G28x5y6[9]),  9,14},
  {&(_ZTV7G28x5y6[13]),  13,14},
  {&(_tg__ZTV3C28__7G28x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y6[];
extern  VTBL_ENTRY _ZTV7G28x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y6[];
static VTBL_ENTRY alt_thunk_names105[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y6 = {  "G28x5y6", // class name
  bases_G28x5y6, 6,
  &(vtc_G28x5y6[0]), // expected_vtbl_contents
  &(vtt_G28x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names105,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x5y7  : virtual E28x5 , virtual F0 {
  int ff;
  ~G28x5y7(); // tgen
  G28x5y7(); // tgen
};
//SIG(1 G28x5y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x5y7 ::~G28x5y7(){ note_dtor("G28x5y7", this);} // tgen
G28x5y7 ::G28x5y7(){ note_ctor("G28x5y7", this);} // tgen

static void Test_G28x5y7()
{
  extern Class_Descriptor cd_G28x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x5y7, buf);
    G28x5y7 *dp, &lv = *(dp=new (buf) G28x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x5y7)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x5y7");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x5y7");
    check_base_class_offset(lv, (C28*)(E28x5*), ABISELECT(32,20), "G28x5y7");
    check_base_class_offset(lv, (D0*)(E28x5*), ABISELECT(24,12), "G28x5y7");
    check_base_class_offset(lv, (E28x5*), ABISELECT(16,8), "G28x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G28x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x5y7.ff");
    test_class_info(&lv, &cd_G28x5y7);
    dp->~G28x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x5y7(Test_G28x5y7, "G28x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x5y7C1Ev();
extern void _ZN7G28x5y7D1Ev();
Name_Map name_map_G28x5y7[] = {
  NSPAIR(_ZN7G28x5y7C1Ev),
  NSPAIR(_ZN7G28x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x5;
extern VTBL_ENTRY _ZTI5E28x5[];
extern  VTBL_ENTRY _ZTV5E28x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E28x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x5y7[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G28x5y7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G28x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x5y7[];
static  VTBL_ENTRY _tg__ZTV5E28x5__7G28x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x5__7G28x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x5__7G28x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x5y7[] = {
  {&(_ZTV7G28x5y7[6]),  6,19},
  {&(_ZTV7G28x5y7[10]),  10,19},
  {&(_ZTV7G28x5y7[14]),  14,19},
  {&(_ZTV7G28x5y7[18]),  18,19},
  {&(_tg__ZTV5E28x5__7G28x5y7[4]),  4,4},
  {&(_tg__ZTV3C28__5E28x5__7G28x5y7[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x5__7G28x5y7[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x5y7[];
extern  VTBL_ENTRY _ZTV7G28x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x5y7[];
static VTBL_ENTRY alt_thunk_names106[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x5y7 = {  "G28x5y7", // class name
  bases_G28x5y7, 6,
  &(vtc_G28x5y7[0]), // expected_vtbl_contents
  &(vtt_G28x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x5y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names106,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x5  : virtual C29 , D0 {
  int fd;
  ~E29x5(); // tgen
  E29x5(); // tgen
};
//SIG(-1 E29x5) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E29x5 ::~E29x5(){ note_dtor("E29x5", this);} // tgen
E29x5 ::E29x5(){ note_ctor("E29x5", this);} // tgen

static void Test_E29x5()
{
  extern Class_Descriptor cd_E29x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E29x5, buf);
    E29x5 *dp, &lv = *(dp=new (buf) E29x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E29x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x5)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,12), "E29x5");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,24), "E29x5");
    check_base_class_offset(lv, (C29*), ABISELECT(16,12), "E29x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E29x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E29x5.fd");
    test_class_info(&lv, &cd_E29x5);
    dp->~E29x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x5(Test_E29x5, "E29x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E29x5C1Ev();
extern void _ZN5E29x5D1Ev();
Name_Map name_map_E29x5[] = {
  NSPAIR(_ZN5E29x5C1Ev),
  NSPAIR(_ZN5E29x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E29x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E29x5[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV5E29x5[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__5E29x5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x5[] = {
  {&(_ZTV5E29x5[4]),  4,13},
  {&(_ZTV5E29x5[8]),  8,13},
  {&(_ZTV5E29x5[12]),  12,13},
  {&(_tg__ZTV3C29__5E29x5[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__5E29x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
static VTBL_ENTRY alt_thunk_names107[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x5 = {  "E29x5", // class name
  bases_E29x5, 4,
  &(vtc_E29x5[0]), // expected_vtbl_contents
  &(vtt_E29x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E29x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E29x5),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E29x5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names107,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y0  : E29x5 , F1 {
  int ff;
  ~G29x5y0(); // tgen
  G29x5y0(); // tgen
};
//SIG(1 G29x5y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x5y0 ::~G29x5y0(){ note_dtor("G29x5y0", this);} // tgen
G29x5y0 ::G29x5y0(){ note_ctor("G29x5y0", this);} // tgen

static void Test_G29x5y0()
{
  extern Class_Descriptor cd_G29x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x5y0, buf);
    G29x5y0 *dp, &lv = *(dp=new (buf) G29x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y0)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,24), "G29x5y0");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,36), "G29x5y0");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(32,24), "G29x5y0");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(8,4), "G29x5y0");
    check_base_class_offset(lv, (E29x5*), 0, "G29x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G29x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G29x5y0.ff");
    test_class_info(&lv, &cd_G29x5y0);
    dp->~G29x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y0(Test_G29x5y0, "G29x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x5y0C1Ev();
extern void _ZN7G29x5y0D1Ev();
Name_Map name_map_G29x5y0[] = {
  NSPAIR(_ZN7G29x5y0C1Ev),
  NSPAIR(_ZN7G29x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x5y0[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G29x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x5y0[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y0[] = {
  {&(_ZTV7G29x5y0[4]),  4,16},
  {&(_tg__ZTV5E29x5__7G29x5y0[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y0[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y0[3]),  3,4},
  {&(_ZTV7G29x5y0[11]),  11,16},
  {&(_ZTV7G29x5y0[15]),  15,16},
  {&(_tg__ZTV3C29__7G29x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y0[];
extern  VTBL_ENTRY _ZTV7G29x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y0[];
static VTBL_ENTRY alt_thunk_names108[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y0 = {  "G29x5y0", // class name
  bases_G29x5y0, 6,
  &(vtc_G29x5y0[0]), // expected_vtbl_contents
  &(vtt_G29x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y0),16, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names108,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y1  : virtual E29x5 , F1 {
  int ff;
  ~G29x5y1(); // tgen
  G29x5y1(); // tgen
};
//SIG(1 G29x5y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x5y1 ::~G29x5y1(){ note_dtor("G29x5y1", this);} // tgen
G29x5y1 ::G29x5y1(){ note_ctor("G29x5y1", this);} // tgen

static void Test_G29x5y1()
{
  extern Class_Descriptor cd_G29x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x5y1, buf);
    G29x5y1 *dp, &lv = *(dp=new (buf) G29x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y1)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,24), "G29x5y1");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,36), "G29x5y1");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(32,24), "G29x5y1");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(24,16), "G29x5y1");
    check_base_class_offset(lv, (E29x5*), ABISELECT(16,12), "G29x5y1");
    check_base_class_offset(lv, (F1*), 0, "G29x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x5y1.ff");
    test_class_info(&lv, &cd_G29x5y1);
    dp->~G29x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y1(Test_G29x5y1, "G29x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x5y1C1Ev();
extern void _ZN7G29x5y1D1Ev();
Name_Map name_map_G29x5y1[] = {
  NSPAIR(_ZN7G29x5y1C1Ev),
  NSPAIR(_ZN7G29x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x5y1[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G29x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x5y1[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y1[] = {
  {&(_ZTV7G29x5y1[5]),  5,19},
  {&(_ZTV7G29x5y1[10]),  10,19},
  {&(_ZTV7G29x5y1[14]),  14,19},
  {&(_ZTV7G29x5y1[18]),  18,19},
  {&(_tg__ZTV5E29x5__7G29x5y1[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y1[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y1[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y1[];
extern  VTBL_ENTRY _ZTV7G29x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y1[];
static VTBL_ENTRY alt_thunk_names109[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y1 = {  "G29x5y1", // class name
  bases_G29x5y1, 6,
  &(vtc_G29x5y1[0]), // expected_vtbl_contents
  &(vtt_G29x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y1),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names109,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y2  : E29x5 , virtual F1 {
  int ff;
  ~G29x5y2(); // tgen
  G29x5y2(); // tgen
};
//SIG(1 G29x5y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x5y2 ::~G29x5y2(){ note_dtor("G29x5y2", this);} // tgen
G29x5y2 ::G29x5y2(){ note_ctor("G29x5y2", this);} // tgen

static void Test_G29x5y2()
{
  extern Class_Descriptor cd_G29x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x5y2, buf);
    G29x5y2 *dp, &lv = *(dp=new (buf) G29x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y2)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,16), "G29x5y2");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,28), "G29x5y2");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(24,16), "G29x5y2");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(8,4), "G29x5y2");
    check_base_class_offset(lv, (E29x5*), 0, "G29x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G29x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G29x5y2.ff");
    test_class_info(&lv, &cd_G29x5y2);
    dp->~G29x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y2(Test_G29x5y2, "G29x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G29x5y2C1Ev();
extern void _ZN7G29x5y2D1Ev();
Name_Map name_map_G29x5y2[] = {
  NSPAIR(_ZN7G29x5y2C1Ev),
  NSPAIR(_ZN7G29x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y2[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G29x5y2[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G29x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x5y2[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y2[] = {
  {&(_ZTV7G29x5y2[5]),  5,18},
  {&(_tg__ZTV5E29x5__7G29x5y2[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y2[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y2[3]),  3,4},
  {&(_ZTV7G29x5y2[9]),  9,18},
  {&(_ZTV7G29x5y2[13]),  13,18},
  {&(_ZTV7G29x5y2[17]),  17,18},
  {&(_tg__ZTV3C29__7G29x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y2[];
extern  VTBL_ENTRY _ZTV7G29x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y2[];
static VTBL_ENTRY alt_thunk_names110[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y2 = {  "G29x5y2", // class name
  bases_G29x5y2, 6,
  &(vtc_G29x5y2[0]), // expected_vtbl_contents
  &(vtt_G29x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G29x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y2),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names110,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y3  : virtual E29x5 , virtual F1 {
  int ff;
  ~G29x5y3(); // tgen
  G29x5y3(); // tgen
};
//SIG(1 G29x5y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x5y3 ::~G29x5y3(){ note_dtor("G29x5y3", this);} // tgen
G29x5y3 ::G29x5y3(){ note_ctor("G29x5y3", this);} // tgen

static void Test_G29x5y3()
{
  extern Class_Descriptor cd_G29x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G29x5y3, buf);
    G29x5y3 *dp, &lv = *(dp=new (buf) G29x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G29x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y3)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x5y3");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x5y3");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(32,20), "G29x5y3");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(24,12), "G29x5y3");
    check_base_class_offset(lv, (E29x5*), ABISELECT(16,8), "G29x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G29x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x5y3.ff");
    test_class_info(&lv, &cd_G29x5y3);
    dp->~G29x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y3(Test_G29x5y3, "G29x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G29x5y3C1Ev();
extern void _ZN7G29x5y3D1Ev();
Name_Map name_map_G29x5y3[] = {
  NSPAIR(_ZN7G29x5y3C1Ev),
  NSPAIR(_ZN7G29x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y3[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G29x5y3[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G29x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G29x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x5y3[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y3[] = {
  {&(_ZTV7G29x5y3[6]),  6,23},
  {&(_ZTV7G29x5y3[10]),  10,23},
  {&(_ZTV7G29x5y3[14]),  14,23},
  {&(_ZTV7G29x5y3[18]),  18,23},
  {&(_ZTV7G29x5y3[22]),  22,23},
  {&(_tg__ZTV5E29x5__7G29x5y3[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y3[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y3[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y3[];
extern  VTBL_ENTRY _ZTV7G29x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y3[];
static VTBL_ENTRY alt_thunk_names111[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y3 = {  "G29x5y3", // class name
  bases_G29x5y3, 6,
  &(vtc_G29x5y3[0]), // expected_vtbl_contents
  &(vtt_G29x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G29x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y3),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names111,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y4  : E29x5 , F0 {
  int ff;
  ~G29x5y4(); // tgen
  G29x5y4(); // tgen
};
//SIG(1 G29x5y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G29x5y4 ::~G29x5y4(){ note_dtor("G29x5y4", this);} // tgen
G29x5y4 ::G29x5y4(){ note_ctor("G29x5y4", this);} // tgen

static void Test_G29x5y4()
{
  extern Class_Descriptor cd_G29x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x5y4, buf);
    G29x5y4 *dp, &lv = *(dp=new (buf) G29x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y4)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,20), "G29x5y4");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,32), "G29x5y4");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(24,20), "G29x5y4");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(8,4), "G29x5y4");
    check_base_class_offset(lv, (E29x5*), 0, "G29x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G29x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G29x5y4.ff");
    test_class_info(&lv, &cd_G29x5y4);
    dp->~G29x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y4(Test_G29x5y4, "G29x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x5y4C1Ev();
extern void _ZN7G29x5y4D1Ev();
Name_Map name_map_G29x5y4[] = {
  NSPAIR(_ZN7G29x5y4C1Ev),
  NSPAIR(_ZN7G29x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y4[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G29x5y4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G29x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x5y4[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y4[] = {
  {&(_ZTV7G29x5y4[4]),  4,13},
  {&(_tg__ZTV5E29x5__7G29x5y4[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y4[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y4[3]),  3,4},
  {&(_ZTV7G29x5y4[8]),  8,13},
  {&(_ZTV7G29x5y4[12]),  12,13},
  {&(_tg__ZTV3C29__7G29x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y4[];
extern  VTBL_ENTRY _ZTV7G29x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y4[];
static VTBL_ENTRY alt_thunk_names112[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y4 = {  "G29x5y4", // class name
  bases_G29x5y4, 6,
  &(vtc_G29x5y4[0]), // expected_vtbl_contents
  &(vtt_G29x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y4),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names112,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y5  : virtual E29x5 , F0 {
  int ff;
  ~G29x5y5(); // tgen
  G29x5y5(); // tgen
};
//SIG(1 G29x5y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G29x5y5 ::~G29x5y5(){ note_dtor("G29x5y5", this);} // tgen
G29x5y5 ::G29x5y5(){ note_ctor("G29x5y5", this);} // tgen

static void Test_G29x5y5()
{
  extern Class_Descriptor cd_G29x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x5y5, buf);
    G29x5y5 *dp, &lv = *(dp=new (buf) G29x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y5)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,24), "G29x5y5");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,36), "G29x5y5");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(32,24), "G29x5y5");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(24,16), "G29x5y5");
    check_base_class_offset(lv, (E29x5*), ABISELECT(16,12), "G29x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x5y5.ff");
    test_class_info(&lv, &cd_G29x5y5);
    dp->~G29x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y5(Test_G29x5y5, "G29x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x5y5C1Ev();
extern void _ZN7G29x5y5D1Ev();
Name_Map name_map_G29x5y5[] = {
  NSPAIR(_ZN7G29x5y5C1Ev),
  NSPAIR(_ZN7G29x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y5[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x5y5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G29x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x5y5[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y5[] = {
  {&(_ZTV7G29x5y5[5]),  5,18},
  {&(_ZTV7G29x5y5[9]),  9,18},
  {&(_ZTV7G29x5y5[13]),  13,18},
  {&(_ZTV7G29x5y5[17]),  17,18},
  {&(_tg__ZTV5E29x5__7G29x5y5[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y5[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y5[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y5[];
extern  VTBL_ENTRY _ZTV7G29x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y5[];
static VTBL_ENTRY alt_thunk_names113[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y5 = {  "G29x5y5", // class name
  bases_G29x5y5, 6,
  &(vtc_G29x5y5[0]), // expected_vtbl_contents
  &(vtt_G29x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y5),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names113,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y6  : E29x5 , virtual F0 {
  int ff;
  ~G29x5y6(); // tgen
  G29x5y6(); // tgen
};
//SIG(1 G29x5y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x5y6 ::~G29x5y6(){ note_dtor("G29x5y6", this);} // tgen
G29x5y6 ::G29x5y6(){ note_ctor("G29x5y6", this);} // tgen

static void Test_G29x5y6()
{
  extern Class_Descriptor cd_G29x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x5y6, buf);
    G29x5y6 *dp, &lv = *(dp=new (buf) G29x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y6)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,16), "G29x5y6");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,28), "G29x5y6");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(24,16), "G29x5y6");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(8,4), "G29x5y6");
    check_base_class_offset(lv, (E29x5*), 0, "G29x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G29x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G29x5y6.ff");
    test_class_info(&lv, &cd_G29x5y6);
    dp->~G29x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y6(Test_G29x5y6, "G29x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x5y6C1Ev();
extern void _ZN7G29x5y6D1Ev();
Name_Map name_map_G29x5y6[] = {
  NSPAIR(_ZN7G29x5y6C1Ev),
  NSPAIR(_ZN7G29x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y6[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G29x5y6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x5y6[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y6[] = {
  {&(_ZTV7G29x5y6[5]),  5,14},
  {&(_tg__ZTV5E29x5__7G29x5y6[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y6[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y6[3]),  3,4},
  {&(_ZTV7G29x5y6[9]),  9,14},
  {&(_ZTV7G29x5y6[13]),  13,14},
  {&(_tg__ZTV3C29__7G29x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y6[];
extern  VTBL_ENTRY _ZTV7G29x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y6[];
static VTBL_ENTRY alt_thunk_names114[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y6 = {  "G29x5y6", // class name
  bases_G29x5y6, 6,
  &(vtc_G29x5y6[0]), // expected_vtbl_contents
  &(vtt_G29x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names114,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x5y7  : virtual E29x5 , virtual F0 {
  int ff;
  ~G29x5y7(); // tgen
  G29x5y7(); // tgen
};
//SIG(1 G29x5y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x5y7 ::~G29x5y7(){ note_dtor("G29x5y7", this);} // tgen
G29x5y7 ::G29x5y7(){ note_ctor("G29x5y7", this);} // tgen

static void Test_G29x5y7()
{
  extern Class_Descriptor cd_G29x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x5y7, buf);
    G29x5y7 *dp, &lv = *(dp=new (buf) G29x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x5y7)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x5y7");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x5y7");
    check_base_class_offset(lv, (C29*)(E29x5*), ABISELECT(32,20), "G29x5y7");
    check_base_class_offset(lv, (D0*)(E29x5*), ABISELECT(24,12), "G29x5y7");
    check_base_class_offset(lv, (E29x5*), ABISELECT(16,8), "G29x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G29x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x5y7.ff");
    test_class_info(&lv, &cd_G29x5y7);
    dp->~G29x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x5y7(Test_G29x5y7, "G29x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x5y7C1Ev();
extern void _ZN7G29x5y7D1Ev();
Name_Map name_map_G29x5y7[] = {
  NSPAIR(_ZN7G29x5y7C1Ev),
  NSPAIR(_ZN7G29x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x5;
extern VTBL_ENTRY _ZTI5E29x5[];
extern  VTBL_ENTRY _ZTV5E29x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E29x5,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x5y7[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G29x5y7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G29x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x5y7[];
static  VTBL_ENTRY _tg__ZTV5E29x5__7G29x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x5__7G29x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x5__7G29x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x5y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x5y7[] = {
  {&(_ZTV7G29x5y7[6]),  6,19},
  {&(_ZTV7G29x5y7[10]),  10,19},
  {&(_ZTV7G29x5y7[14]),  14,19},
  {&(_ZTV7G29x5y7[18]),  18,19},
  {&(_tg__ZTV5E29x5__7G29x5y7[4]),  4,4},
  {&(_tg__ZTV3C29__5E29x5__7G29x5y7[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x5__7G29x5y7[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x5y7[];
extern  VTBL_ENTRY _ZTV7G29x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x5y7[];
static VTBL_ENTRY alt_thunk_names115[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x5y7 = {  "G29x5y7", // class name
  bases_G29x5y7, 6,
  &(vtc_G29x5y7[0]), // expected_vtbl_contents
  &(vtt_G29x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x5y7),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x5y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names115,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x5  : virtual C30 , D0 {
  int fd;
  ~E30x5(); // tgen
  E30x5(); // tgen
};
//SIG(-1 E30x5) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E30x5 ::~E30x5(){ note_dtor("E30x5", this);} // tgen
E30x5 ::E30x5(){ note_ctor("E30x5", this);} // tgen

static void Test_E30x5()
{
  extern Class_Descriptor cd_E30x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E30x5, buf);
    E30x5 *dp, &lv = *(dp=new (buf) E30x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E30x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x5)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,20), "E30x5");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,24), "E30x5");
    check_base_class_offset(lv, (C30*), ABISELECT(16,12), "E30x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E30x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E30x5.fd");
    test_class_info(&lv, &cd_E30x5);
    dp->~E30x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x5(Test_E30x5, "E30x5", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E30x5C1Ev();
extern void _ZN5E30x5D1Ev();
Name_Map name_map_E30x5[] = {
  NSPAIR(_ZN5E30x5C1Ev),
  NSPAIR(_ZN5E30x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E30x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E30x5[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV5E30x5[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__5E30x5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x5[] = {
  {&(_ZTV5E30x5[5]),  5,15},
  {&(_ZTV5E30x5[10]),  10,15},
  {&(_ZTV5E30x5[14]),  14,15},
  {&(_tg__ZTV3C30__5E30x5[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__5E30x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
static VTBL_ENTRY alt_thunk_names116[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x5 = {  "E30x5", // class name
  bases_E30x5, 4,
  &(vtc_E30x5[0]), // expected_vtbl_contents
  &(vtt_E30x5[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E30x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E30x5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E30x5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names116,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y0  : E30x5 , F1 {
  int ff;
  ~G30x5y0(); // tgen
  G30x5y0(); // tgen
};
//SIG(1 G30x5y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x5y0 ::~G30x5y0(){ note_dtor("G30x5y0", this);} // tgen
G30x5y0 ::G30x5y0(){ note_ctor("G30x5y0", this);} // tgen

static void Test_G30x5y0()
{
  extern Class_Descriptor cd_G30x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x5y0, buf);
    G30x5y0 *dp, &lv = *(dp=new (buf) G30x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y0)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,32), "G30x5y0");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,36), "G30x5y0");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(32,24), "G30x5y0");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(8,4), "G30x5y0");
    check_base_class_offset(lv, (E30x5*), 0, "G30x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G30x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G30x5y0.ff");
    test_class_info(&lv, &cd_G30x5y0);
    dp->~G30x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y0(Test_G30x5y0, "G30x5y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x5y0C1Ev();
extern void _ZN7G30x5y0D1Ev();
Name_Map name_map_G30x5y0[] = {
  NSPAIR(_ZN7G30x5y0C1Ev),
  NSPAIR(_ZN7G30x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x5y0[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G30x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x5y0[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y0[] = {
  {&(_ZTV7G30x5y0[5]),  5,18},
  {&(_tg__ZTV5E30x5__7G30x5y0[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y0[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y0[3]),  3,4},
  {&(_ZTV7G30x5y0[13]),  13,18},
  {&(_ZTV7G30x5y0[17]),  17,18},
  {&(_tg__ZTV3C30__7G30x5y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y0[];
extern  VTBL_ENTRY _ZTV7G30x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y0[];
static VTBL_ENTRY alt_thunk_names117[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y0 = {  "G30x5y0", // class name
  bases_G30x5y0, 6,
  &(vtc_G30x5y0[0]), // expected_vtbl_contents
  &(vtt_G30x5y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y0),18, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names117,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y1  : virtual E30x5 , F1 {
  int ff;
  ~G30x5y1(); // tgen
  G30x5y1(); // tgen
};
//SIG(1 G30x5y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x5y1 ::~G30x5y1(){ note_dtor("G30x5y1", this);} // tgen
G30x5y1 ::G30x5y1(){ note_ctor("G30x5y1", this);} // tgen

static void Test_G30x5y1()
{
  extern Class_Descriptor cd_G30x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x5y1, buf);
    G30x5y1 *dp, &lv = *(dp=new (buf) G30x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y1)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,32), "G30x5y1");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,36), "G30x5y1");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(32,24), "G30x5y1");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(24,16), "G30x5y1");
    check_base_class_offset(lv, (E30x5*), ABISELECT(16,12), "G30x5y1");
    check_base_class_offset(lv, (F1*), 0, "G30x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x5y1.ff");
    test_class_info(&lv, &cd_G30x5y1);
    dp->~G30x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y1(Test_G30x5y1, "G30x5y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x5y1C1Ev();
extern void _ZN7G30x5y1D1Ev();
Name_Map name_map_G30x5y1[] = {
  NSPAIR(_ZN7G30x5y1C1Ev),
  NSPAIR(_ZN7G30x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x5y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x5y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x5y1[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G30x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x5y1[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y1[] = {
  {&(_ZTV7G30x5y1[6]),  6,22},
  {&(_ZTV7G30x5y1[12]),  12,22},
  {&(_ZTV7G30x5y1[17]),  17,22},
  {&(_ZTV7G30x5y1[21]),  21,22},
  {&(_tg__ZTV5E30x5__7G30x5y1[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y1[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y1[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x5y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y1[];
extern  VTBL_ENTRY _ZTV7G30x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y1[];
static VTBL_ENTRY alt_thunk_names118[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y1 = {  "G30x5y1", // class name
  bases_G30x5y1, 6,
  &(vtc_G30x5y1[0]), // expected_vtbl_contents
  &(vtt_G30x5y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names118,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y2  : E30x5 , virtual F1 {
  int ff;
  ~G30x5y2(); // tgen
  G30x5y2(); // tgen
};
//SIG(1 G30x5y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x5y2 ::~G30x5y2(){ note_dtor("G30x5y2", this);} // tgen
G30x5y2 ::G30x5y2(){ note_ctor("G30x5y2", this);} // tgen

static void Test_G30x5y2()
{
  extern Class_Descriptor cd_G30x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x5y2, buf);
    G30x5y2 *dp, &lv = *(dp=new (buf) G30x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y2)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,24), "G30x5y2");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,28), "G30x5y2");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(24,16), "G30x5y2");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(8,4), "G30x5y2");
    check_base_class_offset(lv, (E30x5*), 0, "G30x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G30x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x5y2.ff");
    test_class_info(&lv, &cd_G30x5y2);
    dp->~G30x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y2(Test_G30x5y2, "G30x5y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G30x5y2C1Ev();
extern void _ZN7G30x5y2D1Ev();
Name_Map name_map_G30x5y2[] = {
  NSPAIR(_ZN7G30x5y2C1Ev),
  NSPAIR(_ZN7G30x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y2[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x5y2[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G30x5y2[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G30x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x5y2[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y2[] = {
  {&(_ZTV7G30x5y2[6]),  6,20},
  {&(_tg__ZTV5E30x5__7G30x5y2[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y2[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y2[3]),  3,4},
  {&(_ZTV7G30x5y2[11]),  11,20},
  {&(_ZTV7G30x5y2[15]),  15,20},
  {&(_ZTV7G30x5y2[19]),  19,20},
  {&(_tg__ZTV3C30__7G30x5y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y2[];
extern  VTBL_ENTRY _ZTV7G30x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y2[];
static VTBL_ENTRY alt_thunk_names119[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y2 = {  "G30x5y2", // class name
  bases_G30x5y2, 6,
  &(vtc_G30x5y2[0]), // expected_vtbl_contents
  &(vtt_G30x5y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G30x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y2),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names119,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y3  : virtual E30x5 , virtual F1 {
  int ff;
  ~G30x5y3(); // tgen
  G30x5y3(); // tgen
};
//SIG(1 G30x5y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x5y3 ::~G30x5y3(){ note_dtor("G30x5y3", this);} // tgen
G30x5y3 ::G30x5y3(){ note_ctor("G30x5y3", this);} // tgen

static void Test_G30x5y3()
{
  extern Class_Descriptor cd_G30x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G30x5y3, buf);
    G30x5y3 *dp, &lv = *(dp=new (buf) G30x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G30x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y3)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x5y3");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x5y3");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(32,20), "G30x5y3");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(24,12), "G30x5y3");
    check_base_class_offset(lv, (E30x5*), ABISELECT(16,8), "G30x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G30x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x5y3.ff");
    test_class_info(&lv, &cd_G30x5y3);
    dp->~G30x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y3(Test_G30x5y3, "G30x5y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G30x5y3C1Ev();
extern void _ZN7G30x5y3D1Ev();
Name_Map name_map_G30x5y3[] = {
  NSPAIR(_ZN7G30x5y3C1Ev),
  NSPAIR(_ZN7G30x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y3[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x5y3[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y3[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x5y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G30x5y3[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G30x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x5y3[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y3[] = {
  {&(_ZTV7G30x5y3[7]),  7,26},
  {&(_ZTV7G30x5y3[12]),  12,26},
  {&(_ZTV7G30x5y3[17]),  17,26},
  {&(_ZTV7G30x5y3[21]),  21,26},
  {&(_ZTV7G30x5y3[25]),  25,26},
  {&(_tg__ZTV5E30x5__7G30x5y3[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y3[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y3[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x5y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y3[];
extern  VTBL_ENTRY _ZTV7G30x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y3[];
static VTBL_ENTRY alt_thunk_names120[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y3 = {  "G30x5y3", // class name
  bases_G30x5y3, 6,
  &(vtc_G30x5y3[0]), // expected_vtbl_contents
  &(vtt_G30x5y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G30x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names120,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y4  : E30x5 , F0 {
  int ff;
  ~G30x5y4(); // tgen
  G30x5y4(); // tgen
};
//SIG(1 G30x5y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G30x5y4 ::~G30x5y4(){ note_dtor("G30x5y4", this);} // tgen
G30x5y4 ::G30x5y4(){ note_ctor("G30x5y4", this);} // tgen

static void Test_G30x5y4()
{
  extern Class_Descriptor cd_G30x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x5y4, buf);
    G30x5y4 *dp, &lv = *(dp=new (buf) G30x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y4)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,28), "G30x5y4");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,32), "G30x5y4");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(24,20), "G30x5y4");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(8,4), "G30x5y4");
    check_base_class_offset(lv, (E30x5*), 0, "G30x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G30x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x5y4.ff");
    test_class_info(&lv, &cd_G30x5y4);
    dp->~G30x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y4(Test_G30x5y4, "G30x5y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x5y4C1Ev();
extern void _ZN7G30x5y4D1Ev();
Name_Map name_map_G30x5y4[] = {
  NSPAIR(_ZN7G30x5y4C1Ev),
  NSPAIR(_ZN7G30x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y4[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G30x5y4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G30x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x5y4[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y4[] = {
  {&(_ZTV7G30x5y4[5]),  5,15},
  {&(_tg__ZTV5E30x5__7G30x5y4[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y4[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y4[3]),  3,4},
  {&(_ZTV7G30x5y4[10]),  10,15},
  {&(_ZTV7G30x5y4[14]),  14,15},
  {&(_tg__ZTV3C30__7G30x5y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y4[];
extern  VTBL_ENTRY _ZTV7G30x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y4[];
static VTBL_ENTRY alt_thunk_names121[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y4 = {  "G30x5y4", // class name
  bases_G30x5y4, 6,
  &(vtc_G30x5y4[0]), // expected_vtbl_contents
  &(vtt_G30x5y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y4),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names121,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y5  : virtual E30x5 , F0 {
  int ff;
  ~G30x5y5(); // tgen
  G30x5y5(); // tgen
};
//SIG(1 G30x5y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G30x5y5 ::~G30x5y5(){ note_dtor("G30x5y5", this);} // tgen
G30x5y5 ::G30x5y5(){ note_ctor("G30x5y5", this);} // tgen

static void Test_G30x5y5()
{
  extern Class_Descriptor cd_G30x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x5y5, buf);
    G30x5y5 *dp, &lv = *(dp=new (buf) G30x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y5)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,32), "G30x5y5");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,36), "G30x5y5");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(32,24), "G30x5y5");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(24,16), "G30x5y5");
    check_base_class_offset(lv, (E30x5*), ABISELECT(16,12), "G30x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x5y5.ff");
    test_class_info(&lv, &cd_G30x5y5);
    dp->~G30x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y5(Test_G30x5y5, "G30x5y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x5y5C1Ev();
extern void _ZN7G30x5y5D1Ev();
Name_Map name_map_G30x5y5[] = {
  NSPAIR(_ZN7G30x5y5C1Ev),
  NSPAIR(_ZN7G30x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y5[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x5y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y5[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x5y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x5y5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G30x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x5y5[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y5[] = {
  {&(_ZTV7G30x5y5[6]),  6,21},
  {&(_ZTV7G30x5y5[11]),  11,21},
  {&(_ZTV7G30x5y5[16]),  16,21},
  {&(_ZTV7G30x5y5[20]),  20,21},
  {&(_tg__ZTV5E30x5__7G30x5y5[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y5[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y5[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x5y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y5[];
extern  VTBL_ENTRY _ZTV7G30x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y5[];
static VTBL_ENTRY alt_thunk_names122[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y5 = {  "G30x5y5", // class name
  bases_G30x5y5, 6,
  &(vtc_G30x5y5[0]), // expected_vtbl_contents
  &(vtt_G30x5y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names122,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y6  : E30x5 , virtual F0 {
  int ff;
  ~G30x5y6(); // tgen
  G30x5y6(); // tgen
};
//SIG(1 G30x5y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x5y6 ::~G30x5y6(){ note_dtor("G30x5y6", this);} // tgen
G30x5y6 ::G30x5y6(){ note_ctor("G30x5y6", this);} // tgen

static void Test_G30x5y6()
{
  extern Class_Descriptor cd_G30x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x5y6, buf);
    G30x5y6 *dp, &lv = *(dp=new (buf) G30x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y6)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,24), "G30x5y6");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,28), "G30x5y6");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(24,16), "G30x5y6");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(8,4), "G30x5y6");
    check_base_class_offset(lv, (E30x5*), 0, "G30x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G30x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x5y6.ff");
    test_class_info(&lv, &cd_G30x5y6);
    dp->~G30x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y6(Test_G30x5y6, "G30x5y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x5y6C1Ev();
extern void _ZN7G30x5y6D1Ev();
Name_Map name_map_G30x5y6[] = {
  NSPAIR(_ZN7G30x5y6C1Ev),
  NSPAIR(_ZN7G30x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y6[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x5y6[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G30x5y6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x5y6[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y6[] = {
  {&(_ZTV7G30x5y6[6]),  6,16},
  {&(_tg__ZTV5E30x5__7G30x5y6[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y6[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y6[3]),  3,4},
  {&(_ZTV7G30x5y6[11]),  11,16},
  {&(_ZTV7G30x5y6[15]),  15,16},
  {&(_tg__ZTV3C30__7G30x5y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y6[];
extern  VTBL_ENTRY _ZTV7G30x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y6[];
static VTBL_ENTRY alt_thunk_names123[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y6 = {  "G30x5y6", // class name
  bases_G30x5y6, 6,
  &(vtc_G30x5y6[0]), // expected_vtbl_contents
  &(vtt_G30x5y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y6),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names123,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x5y7  : virtual E30x5 , virtual F0 {
  int ff;
  ~G30x5y7(); // tgen
  G30x5y7(); // tgen
};
//SIG(1 G30x5y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x5y7 ::~G30x5y7(){ note_dtor("G30x5y7", this);} // tgen
G30x5y7 ::G30x5y7(){ note_ctor("G30x5y7", this);} // tgen

static void Test_G30x5y7()
{
  extern Class_Descriptor cd_G30x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x5y7, buf);
    G30x5y7 *dp, &lv = *(dp=new (buf) G30x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x5y7)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x5y7");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x5y7");
    check_base_class_offset(lv, (C30*)(E30x5*), ABISELECT(32,20), "G30x5y7");
    check_base_class_offset(lv, (D0*)(E30x5*), ABISELECT(24,12), "G30x5y7");
    check_base_class_offset(lv, (E30x5*), ABISELECT(16,8), "G30x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(60,40), "G30x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x5y7.ff");
    test_class_info(&lv, &cd_G30x5y7);
    dp->~G30x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x5y7(Test_G30x5y7, "G30x5y7", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x5y7C1Ev();
extern void _ZN7G30x5y7D1Ev();
Name_Map name_map_G30x5y7[] = {
  NSPAIR(_ZN7G30x5y7C1Ev),
  NSPAIR(_ZN7G30x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x5;
extern VTBL_ENTRY _ZTI5E30x5[];
extern  VTBL_ENTRY _ZTV5E30x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E30x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x5y7[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x5y7[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x5y7[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x5y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G30x5y7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x5y7[];
static  VTBL_ENTRY _tg__ZTV5E30x5__7G30x5y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x5__7G30x5y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x5__7G30x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x5y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x5y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x5y7[] = {
  {&(_ZTV7G30x5y7[7]),  7,22},
  {&(_ZTV7G30x5y7[12]),  12,22},
  {&(_ZTV7G30x5y7[17]),  17,22},
  {&(_ZTV7G30x5y7[21]),  21,22},
  {&(_tg__ZTV5E30x5__7G30x5y7[5]),  5,5},
  {&(_tg__ZTV3C30__5E30x5__7G30x5y7[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x5__7G30x5y7[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x5y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x5y7[];
extern  VTBL_ENTRY _ZTV7G30x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x5y7[];
static VTBL_ENTRY alt_thunk_names124[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x5y7 = {  "G30x5y7", // class name
  bases_G30x5y7, 6,
  &(vtc_G30x5y7[0]), // expected_vtbl_contents
  &(vtt_G30x5y7[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x5y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x5y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names124,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x5  : virtual C31 , D0 {
  int fd;
  ~E31x5(); // tgen
  E31x5(); // tgen
};
//SIG(-1 E31x5) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} BC5{ Fi} Fi}


E31x5 ::~E31x5(){ note_dtor("E31x5", this);} // tgen
E31x5 ::E31x5(){ note_ctor("E31x5", this);} // tgen

static void Test_E31x5()
{
  extern Class_Descriptor cd_E31x5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E31x5, buf);
    E31x5 *dp, &lv = *(dp=new (buf) E31x5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E31x5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x5)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,20), "E31x5");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,28), "E31x5");
    check_base_class_offset(lv, (C31*), ABISELECT(16,12), "E31x5");
    check_base_class_offset(lv, (D0*), ABISELECT(8,4), "E31x5");
    check_field_offset(lv, fd, ABISELECT(12,8), "E31x5.fd");
    test_class_info(&lv, &cd_E31x5);
    dp->~E31x5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x5(Test_E31x5, "E31x5", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN5E31x5C1Ev();
extern void _ZN5E31x5D1Ev();
Name_Map name_map_E31x5[] = {
  NSPAIR(_ZN5E31x5C1Ev),
  NSPAIR(_ZN5E31x5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E31x5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI5E31x5[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x5[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV5E31x5[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__5E31x5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__5E31x5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x5[] = {
  {&(_ZTV5E31x5[5]),  5,19},
  {&(_ZTV5E31x5[10]),  10,19},
  {&(_ZTV5E31x5[14]),  14,19},
  {&(_ZTV5E31x5[18]),  18,19},
  {&(_tg__ZTV3C31__5E31x5[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__5E31x5[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__5E31x5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
static VTBL_ENTRY alt_thunk_names125[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x5 = {  "E31x5", // class name
  bases_E31x5, 4,
  &(vtc_E31x5[0]), // expected_vtbl_contents
  &(vtt_E31x5[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI5E31x5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E31x5),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E31x5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names125,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y0  : E31x5 , F1 {
  int ff;
  ~G31x5y0(); // tgen
  G31x5y0(); // tgen
};
//SIG(1 G31x5y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x5y0 ::~G31x5y0(){ note_dtor("G31x5y0", this);} // tgen
G31x5y0 ::G31x5y0(){ note_ctor("G31x5y0", this);} // tgen

static void Test_G31x5y0()
{
  extern Class_Descriptor cd_G31x5y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x5y0, buf);
    G31x5y0 *dp, &lv = *(dp=new (buf) G31x5y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x5y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y0)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,32), "G31x5y0");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,40), "G31x5y0");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(32,24), "G31x5y0");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(8,4), "G31x5y0");
    check_base_class_offset(lv, (E31x5*), 0, "G31x5y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G31x5y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G31x5y0.ff");
    test_class_info(&lv, &cd_G31x5y0);
    dp->~G31x5y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y0(Test_G31x5y0, "G31x5y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x5y0C1Ev();
extern void _ZN7G31x5y0D1Ev();
Name_Map name_map_G31x5y0[] = {
  NSPAIR(_ZN7G31x5y0C1Ev),
  NSPAIR(_ZN7G31x5y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x5y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,40), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x5y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x5y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x5y0[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G31x5y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x5y0[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y0[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y0[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y0[] = {
  ABISELECT(-32,-16),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y0[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y0[] = {
  {&(_ZTV7G31x5y0[5]),  5,22},
  {&(_tg__ZTV5E31x5__7G31x5y0[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y0[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y0[3]),  3,4},
  {&(_ZTV7G31x5y0[13]),  13,22},
  {&(_ZTV7G31x5y0[17]),  17,22},
  {&(_ZTV7G31x5y0[21]),  21,22},
  {&(_tg__ZTV3C31__7G31x5y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y0[];
extern  VTBL_ENTRY _ZTV7G31x5y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y0[];
static VTBL_ENTRY alt_thunk_names126[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y0 = {  "G31x5y0", // class name
  bases_G31x5y0, 6,
  &(vtc_G31x5y0[0]), // expected_vtbl_contents
  &(vtt_G31x5y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x5y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y0),22, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names126,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y1  : virtual E31x5 , F1 {
  int ff;
  ~G31x5y1(); // tgen
  G31x5y1(); // tgen
};
//SIG(1 G31x5y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x5y1 ::~G31x5y1(){ note_dtor("G31x5y1", this);} // tgen
G31x5y1 ::G31x5y1(){ note_ctor("G31x5y1", this);} // tgen

static void Test_G31x5y1()
{
  extern Class_Descriptor cd_G31x5y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x5y1, buf);
    G31x5y1 *dp, &lv = *(dp=new (buf) G31x5y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x5y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y1)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,32), "G31x5y1");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,40), "G31x5y1");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(32,24), "G31x5y1");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(24,16), "G31x5y1");
    check_base_class_offset(lv, (E31x5*), ABISELECT(16,12), "G31x5y1");
    check_base_class_offset(lv, (F1*), 0, "G31x5y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x5y1.ff");
    test_class_info(&lv, &cd_G31x5y1);
    dp->~G31x5y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y1(Test_G31x5y1, "G31x5y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x5y1C1Ev();
extern void _ZN7G31x5y1D1Ev();
Name_Map name_map_G31x5y1[] = {
  NSPAIR(_ZN7G31x5y1C1Ev),
  NSPAIR(_ZN7G31x5y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x5y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,40), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x5y1[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x5y1[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x5y1[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G31x5y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x5y1[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y1[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y1[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y1[] = {
  {&(_ZTV7G31x5y1[6]),  6,26},
  {&(_ZTV7G31x5y1[12]),  12,26},
  {&(_ZTV7G31x5y1[17]),  17,26},
  {&(_ZTV7G31x5y1[21]),  21,26},
  {&(_ZTV7G31x5y1[25]),  25,26},
  {&(_tg__ZTV5E31x5__7G31x5y1[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y1[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y1[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x5y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y1[];
extern  VTBL_ENTRY _ZTV7G31x5y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y1[];
static VTBL_ENTRY alt_thunk_names127[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y1 = {  "G31x5y1", // class name
  bases_G31x5y1, 6,
  &(vtc_G31x5y1[0]), // expected_vtbl_contents
  &(vtt_G31x5y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x5y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y1),26, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names127,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y2  : E31x5 , virtual F1 {
  int ff;
  ~G31x5y2(); // tgen
  G31x5y2(); // tgen
};
//SIG(1 G31x5y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x5y2 ::~G31x5y2(){ note_dtor("G31x5y2", this);} // tgen
G31x5y2 ::G31x5y2(){ note_ctor("G31x5y2", this);} // tgen

static void Test_G31x5y2()
{
  extern Class_Descriptor cd_G31x5y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G31x5y2, buf);
    G31x5y2 *dp, &lv = *(dp=new (buf) G31x5y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G31x5y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y2)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,24), "G31x5y2");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,32), "G31x5y2");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(24,16), "G31x5y2");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(8,4), "G31x5y2");
    check_base_class_offset(lv, (E31x5*), 0, "G31x5y2");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G31x5y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x5y2.ff");
    test_class_info(&lv, &cd_G31x5y2);
    dp->~G31x5y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y2(Test_G31x5y2, "G31x5y2", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G31x5y2C1Ev();
extern void _ZN7G31x5y2D1Ev();
Name_Map name_map_G31x5y2[] = {
  NSPAIR(_ZN7G31x5y2C1Ev),
  NSPAIR(_ZN7G31x5y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x5y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y2[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x5y2[] = {
  ABISELECT(72,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y2[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G31x5y2[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G31x5y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G31x5y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x5y2[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y2[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y2[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y2[] = {
  ABISELECT(-32,-16),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y2[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y2[] = {
  {&(_ZTV7G31x5y2[6]),  6,24},
  {&(_tg__ZTV5E31x5__7G31x5y2[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y2[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y2[3]),  3,4},
  {&(_ZTV7G31x5y2[11]),  11,24},
  {&(_ZTV7G31x5y2[15]),  15,24},
  {&(_ZTV7G31x5y2[19]),  19,24},
  {&(_ZTV7G31x5y2[23]),  23,24},
  {&(_tg__ZTV3C31__7G31x5y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y2[];
extern  VTBL_ENTRY _ZTV7G31x5y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y2[];
static VTBL_ENTRY alt_thunk_names128[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y2 = {  "G31x5y2", // class name
  bases_G31x5y2, 6,
  &(vtc_G31x5y2[0]), // expected_vtbl_contents
  &(vtt_G31x5y2[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G31x5y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y2),24, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names128,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y3  : virtual E31x5 , virtual F1 {
  int ff;
  ~G31x5y3(); // tgen
  G31x5y3(); // tgen
};
//SIG(1 G31x5y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x5y3 ::~G31x5y3(){ note_dtor("G31x5y3", this);} // tgen
G31x5y3 ::G31x5y3(){ note_ctor("G31x5y3", this);} // tgen

static void Test_G31x5y3()
{
  extern Class_Descriptor cd_G31x5y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G31x5y3, buf);
    G31x5y3 *dp, &lv = *(dp=new (buf) G31x5y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G31x5y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y3)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x5y3");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x5y3");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(32,20), "G31x5y3");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(24,12), "G31x5y3");
    check_base_class_offset(lv, (E31x5*), ABISELECT(16,8), "G31x5y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G31x5y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x5y3.ff");
    test_class_info(&lv, &cd_G31x5y3);
    dp->~G31x5y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y3(Test_G31x5y3, "G31x5y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN7G31x5y3C1Ev();
extern void _ZN7G31x5y3D1Ev();
Name_Map name_map_G31x5y3[] = {
  NSPAIR(_ZN7G31x5y3C1Ev),
  NSPAIR(_ZN7G31x5y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x5y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    11, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(80,44), //bcp->offset
    26, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y3[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x5y3[] = {
  ABISELECT(80,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y3[0]),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x5y3[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x5y3[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G31x5y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI7G31x5y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x5y3[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y3[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y3[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y3[] = {
  {&(_ZTV7G31x5y3[7]),  7,30},
  {&(_ZTV7G31x5y3[12]),  12,30},
  {&(_ZTV7G31x5y3[17]),  17,30},
  {&(_ZTV7G31x5y3[21]),  21,30},
  {&(_ZTV7G31x5y3[25]),  25,30},
  {&(_ZTV7G31x5y3[29]),  29,30},
  {&(_tg__ZTV5E31x5__7G31x5y3[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y3[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y3[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x5y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y3[];
extern  VTBL_ENTRY _ZTV7G31x5y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y3[];
static VTBL_ENTRY alt_thunk_names129[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y3 = {  "G31x5y3", // class name
  bases_G31x5y3, 6,
  &(vtc_G31x5y3[0]), // expected_vtbl_contents
  &(vtt_G31x5y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI7G31x5y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y3),30, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names129,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y4  : E31x5 , F0 {
  int ff;
  ~G31x5y4(); // tgen
  G31x5y4(); // tgen
};
//SIG(1 G31x5y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G31x5y4 ::~G31x5y4(){ note_dtor("G31x5y4", this);} // tgen
G31x5y4 ::G31x5y4(){ note_ctor("G31x5y4", this);} // tgen

static void Test_G31x5y4()
{
  extern Class_Descriptor cd_G31x5y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x5y4, buf);
    G31x5y4 *dp, &lv = *(dp=new (buf) G31x5y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x5y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y4)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,28), "G31x5y4");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,36), "G31x5y4");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(24,20), "G31x5y4");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(8,4), "G31x5y4");
    check_base_class_offset(lv, (E31x5*), 0, "G31x5y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G31x5y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x5y4.ff");
    test_class_info(&lv, &cd_G31x5y4);
    dp->~G31x5y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y4(Test_G31x5y4, "G31x5y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x5y4C1Ev();
extern void _ZN7G31x5y4D1Ev();
Name_Map name_map_G31x5y4[] = {
  NSPAIR(_ZN7G31x5y4C1Ev),
  NSPAIR(_ZN7G31x5y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x5y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y4[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x5y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y4[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G31x5y4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G31x5y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x5y4[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y4[] = {
  ABISELECT(56,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y4[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y4[] = {
  ABISELECT(-32,-16),
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y4[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y4[] = {
  {&(_ZTV7G31x5y4[5]),  5,19},
  {&(_tg__ZTV5E31x5__7G31x5y4[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y4[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y4[3]),  3,4},
  {&(_ZTV7G31x5y4[10]),  10,19},
  {&(_ZTV7G31x5y4[14]),  14,19},
  {&(_ZTV7G31x5y4[18]),  18,19},
  {&(_tg__ZTV3C31__7G31x5y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y4[];
extern  VTBL_ENTRY _ZTV7G31x5y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y4[];
static VTBL_ENTRY alt_thunk_names130[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y4 = {  "G31x5y4", // class name
  bases_G31x5y4, 6,
  &(vtc_G31x5y4[0]), // expected_vtbl_contents
  &(vtt_G31x5y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x5y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y4),19, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names130,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y5  : virtual E31x5 , F0 {
  int ff;
  ~G31x5y5(); // tgen
  G31x5y5(); // tgen
};
//SIG(1 G31x5y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} BC7{ Fi} Fi}


G31x5y5 ::~G31x5y5(){ note_dtor("G31x5y5", this);} // tgen
G31x5y5 ::G31x5y5(){ note_ctor("G31x5y5", this);} // tgen

static void Test_G31x5y5()
{
  extern Class_Descriptor cd_G31x5y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x5y5, buf);
    G31x5y5 *dp, &lv = *(dp=new (buf) G31x5y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x5y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y5)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,32), "G31x5y5");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,40), "G31x5y5");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(32,24), "G31x5y5");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(24,16), "G31x5y5");
    check_base_class_offset(lv, (E31x5*), ABISELECT(16,12), "G31x5y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x5y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x5y5.ff");
    test_class_info(&lv, &cd_G31x5y5);
    dp->~G31x5y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y5(Test_G31x5y5, "G31x5y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x5y5C1Ev();
extern void _ZN7G31x5y5D1Ev();
Name_Map name_map_G31x5y5[] = {
  NSPAIR(_ZN7G31x5y5C1Ev),
  NSPAIR(_ZN7G31x5y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x5y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y5[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x5y5[] = {
  ABISELECT(64,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y5[0]),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x5y5[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x5y5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G31x5y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x5y5[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y5[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y5[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y5[] = {
  {&(_ZTV7G31x5y5[6]),  6,25},
  {&(_ZTV7G31x5y5[11]),  11,25},
  {&(_ZTV7G31x5y5[16]),  16,25},
  {&(_ZTV7G31x5y5[20]),  20,25},
  {&(_ZTV7G31x5y5[24]),  24,25},
  {&(_tg__ZTV5E31x5__7G31x5y5[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y5[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y5[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x5y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y5[];
extern  VTBL_ENTRY _ZTV7G31x5y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y5[];
static VTBL_ENTRY alt_thunk_names131[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y5 = {  "G31x5y5", // class name
  bases_G31x5y5, 6,
  &(vtc_G31x5y5[0]), // expected_vtbl_contents
  &(vtt_G31x5y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x5y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y5),25, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names131,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y6  : E31x5 , virtual F0 {
  int ff;
  ~G31x5y6(); // tgen
  G31x5y6(); // tgen
};
//SIG(1 G31x5y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x5y6 ::~G31x5y6(){ note_dtor("G31x5y6", this);} // tgen
G31x5y6 ::G31x5y6(){ note_ctor("G31x5y6", this);} // tgen

static void Test_G31x5y6()
{
  extern Class_Descriptor cd_G31x5y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x5y6, buf);
    G31x5y6 *dp, &lv = *(dp=new (buf) G31x5y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x5y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y6)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,24), "G31x5y6");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,32), "G31x5y6");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(24,16), "G31x5y6");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(8,4), "G31x5y6");
    check_base_class_offset(lv, (E31x5*), 0, "G31x5y6");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G31x5y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x5y6.ff");
    test_class_info(&lv, &cd_G31x5y6);
    dp->~G31x5y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y6(Test_G31x5y6, "G31x5y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x5y6C1Ev();
extern void _ZN7G31x5y6D1Ev();
Name_Map name_map_G31x5y6[] = {
  NSPAIR(_ZN7G31x5y6C1Ev),
  NSPAIR(_ZN7G31x5y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x5y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y6[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x5y6[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y6[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G31x5y6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G31x5y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x5y6[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y6[] = {
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y6[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y6[] = {
  ABISELECT(-32,-16),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y6[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y6[] = {
  {&(_ZTV7G31x5y6[6]),  6,20},
  {&(_tg__ZTV5E31x5__7G31x5y6[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y6[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y6[3]),  3,4},
  {&(_ZTV7G31x5y6[11]),  11,20},
  {&(_ZTV7G31x5y6[15]),  15,20},
  {&(_ZTV7G31x5y6[19]),  19,20},
  {&(_tg__ZTV3C31__7G31x5y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y6[];
extern  VTBL_ENTRY _ZTV7G31x5y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y6[];
static VTBL_ENTRY alt_thunk_names132[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y6 = {  "G31x5y6", // class name
  bases_G31x5y6, 6,
  &(vtc_G31x5y6[0]), // expected_vtbl_contents
  &(vtt_G31x5y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x5y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y6),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names132,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x5y7  : virtual E31x5 , virtual F0 {
  int ff;
  ~G31x5y7(); // tgen
  G31x5y7(); // tgen
};
//SIG(1 G31x5y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} BC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x5y7 ::~G31x5y7(){ note_dtor("G31x5y7", this);} // tgen
G31x5y7 ::G31x5y7(){ note_ctor("G31x5y7", this);} // tgen

static void Test_G31x5y7()
{
  extern Class_Descriptor cd_G31x5y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x5y7, buf);
    G31x5y7 *dp, &lv = *(dp=new (buf) G31x5y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x5y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x5y7)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x5y7");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x5y7");
    check_base_class_offset(lv, (C31*)(E31x5*), ABISELECT(32,20), "G31x5y7");
    check_base_class_offset(lv, (D0*)(E31x5*), ABISELECT(24,12), "G31x5y7");
    check_base_class_offset(lv, (E31x5*), ABISELECT(16,8), "G31x5y7");
    check_base_class_offset(lv, (F0*), ABISELECT(76,44), "G31x5y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x5y7.ff");
    test_class_info(&lv, &cd_G31x5y7);
    dp->~G31x5y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x5y7(Test_G31x5y7, "G31x5y7", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x5y7C1Ev();
extern void _ZN7G31x5y7D1Ev();
Name_Map name_map_G31x5y7[] = {
  NSPAIR(_ZN7G31x5y7C1Ev),
  NSPAIR(_ZN7G31x5y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x5;
extern VTBL_ENTRY _ZTI5E31x5[];
extern  VTBL_ENTRY _ZTV5E31x5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x5[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x5y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_E31x5,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x5y7[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x5y7[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x5y7[0]),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x5y7[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x5y7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G31x5y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x5y7[];
static  VTBL_ENTRY _tg__ZTV5E31x5__7G31x5y7[] = {
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x5__7G31x5y7[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x5__7G31x5y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x5__7G31x5y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x5y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x5y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x5y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x5y7[] = {
  {&(_ZTV7G31x5y7[7]),  7,26},
  {&(_ZTV7G31x5y7[12]),  12,26},
  {&(_ZTV7G31x5y7[17]),  17,26},
  {&(_ZTV7G31x5y7[21]),  21,26},
  {&(_ZTV7G31x5y7[25]),  25,26},
  {&(_tg__ZTV5E31x5__7G31x5y7[5]),  5,5},
  {&(_tg__ZTV3C31__5E31x5__7G31x5y7[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x5__7G31x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x5__7G31x5y7[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x5y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x5y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x5y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x5y7[];
extern  VTBL_ENTRY _ZTV7G31x5y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x5y7[];
static VTBL_ENTRY alt_thunk_names133[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x5y7 = {  "G31x5y7", // class name
  bases_G31x5y7, 6,
  &(vtc_G31x5y7[0]), // expected_vtbl_contents
  &(vtt_G31x5y7[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x5y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x5y7),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x5y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names133,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E0x6  : C0 , virtual D0 {
  int fd;
  ~E0x6(); // tgen
  E0x6(); // tgen
};
//SIG(-1 E0x6) C1{ BC2{ BC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E0x6 ::~E0x6(){ note_dtor("E0x6", this);} // tgen
E0x6 ::E0x6(){ note_ctor("E0x6", this);} // tgen

static void Test_E0x6()
{
  extern Class_Descriptor cd_E0x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x6, buf);
    E0x6 *dp, &lv = *(dp=new (buf) E0x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x6)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(8,4), "E0x6");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(12,8), "E0x6");
    check_base_class_offset(lv, (C0*), ABISELECT(8,4), "E0x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E0x6");
    check_field_offset(lv, fd, ABISELECT(20,16), "E0x6.fd");
    test_class_info(&lv, &cd_E0x6);
    dp->~E0x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x6(Test_E0x6, "E0x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E0x6C1Ev();
extern void _ZN4E0x6D1Ev();
Name_Map name_map_E0x6[] = {
  NSPAIR(_ZN4E0x6C1Ev),
  NSPAIR(_ZN4E0x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E0x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E0x6[];
static  VTBL_ENTRY vtc_E0x6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
extern VTBL_ENTRY _ZTV4E0x6[];
static  VTT_ENTRY vtt_E0x6[] = {
  {&(_ZTV4E0x6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
Class_Descriptor cd_E0x6 = {  "E0x6", // class name
  bases_E0x6, 4,
  &(vtc_E0x6[0]), // expected_vtbl_contents
  &(vtt_E0x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E0x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E0x6),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E0x6),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y0  : E0x6 , F1 {
  int ff;
  ~G0x6y0(); // tgen
  G0x6y0(); // tgen
};
//SIG(1 G0x6y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x6y0 ::~G0x6y0(){ note_dtor("G0x6y0", this);} // tgen
G0x6y0 ::G0x6y0(){ note_ctor("G0x6y0", this);} // tgen

static void Test_G0x6y0()
{
  extern Class_Descriptor cd_G0x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x6y0, buf);
    G0x6y0 *dp, &lv = *(dp=new (buf) G0x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y0)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(8,4), "G0x6y0");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(12,8), "G0x6y0");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(8,4), "G0x6y0");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(40,32), "G0x6y0");
    check_base_class_offset(lv, (E0x6*), 0, "G0x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G0x6y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G0x6y0.ff");
    test_class_info(&lv, &cd_G0x6y0);
    dp->~G0x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y0(Test_G0x6y0, "G0x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x6y0C1Ev();
extern void _ZN6G0x6y0D1Ev();
Name_Map name_map_G0x6y0[] = {
  NSPAIR(_ZN6G0x6y0C1Ev),
  NSPAIR(_ZN6G0x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    3, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y0[0]),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G0x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x6y0[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y0[] = {
  {&(_ZTV6G0x6y0[3]),  3,6},
  {&(_tg__ZTV4E0x6__6G0x6y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y0[];
extern  VTBL_ENTRY _ZTV6G0x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y0[];
Class_Descriptor cd_G0x6y0 = {  "G0x6y0", // class name
  bases_G0x6y0, 6,
  &(vtc_G0x6y0[0]), // expected_vtbl_contents
  &(vtt_G0x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y0),6, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y0),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y1  : virtual E0x6 , F1 {
  int ff;
  ~G0x6y1(); // tgen
  G0x6y1(); // tgen
};
//SIG(1 G0x6y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x6y1 ::~G0x6y1(){ note_dtor("G0x6y1", this);} // tgen
G0x6y1 ::G0x6y1(){ note_ctor("G0x6y1", this);} // tgen

static void Test_G0x6y1()
{
  extern Class_Descriptor cd_G0x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x6y1, buf);
    G0x6y1 *dp, &lv = *(dp=new (buf) G0x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y1)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(24,16), "G0x6y1");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(28,20), "G0x6y1");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(24,16), "G0x6y1");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(40,32), "G0x6y1");
    check_base_class_offset(lv, (E0x6*), ABISELECT(16,12), "G0x6y1");
    check_base_class_offset(lv, (F1*), 0, "G0x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x6y1.ff");
    test_class_info(&lv, &cd_G0x6y1);
    dp->~G0x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y1(Test_G0x6y1, "G0x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x6y1C1Ev();
extern void _ZN6G0x6y1D1Ev();
Name_Map name_map_G0x6y1[] = {
  NSPAIR(_ZN6G0x6y1C1Ev),
  NSPAIR(_ZN6G0x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x6y1[0]),
};
extern VTBL_ENTRY _ZTV6G0x6y1[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y1[] = {
  {&(_ZTV6G0x6y1[4]),  4,8},
  {&(_ZTV6G0x6y1[8]),  8,8},
  {&(_tg__ZTV4E0x6__6G0x6y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y1[];
extern  VTBL_ENTRY _ZTV6G0x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y1[];
Class_Descriptor cd_G0x6y1 = {  "G0x6y1", // class name
  bases_G0x6y1, 6,
  &(vtc_G0x6y1[0]), // expected_vtbl_contents
  &(vtt_G0x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y1),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y1),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y2  : E0x6 , virtual F1 {
  int ff;
  ~G0x6y2(); // tgen
  G0x6y2(); // tgen
};
//SIG(1 G0x6y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x6y2 ::~G0x6y2(){ note_dtor("G0x6y2", this);} // tgen
G0x6y2 ::G0x6y2(){ note_ctor("G0x6y2", this);} // tgen

static void Test_G0x6y2()
{
  extern Class_Descriptor cd_G0x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x6y2, buf);
    G0x6y2 *dp, &lv = *(dp=new (buf) G0x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y2)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(8,4), "G0x6y2");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(12,8), "G0x6y2");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(8,4), "G0x6y2");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(28,24), "G0x6y2");
    check_base_class_offset(lv, (E0x6*), 0, "G0x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x6y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G0x6y2.ff");
    test_class_info(&lv, &cd_G0x6y2);
    dp->~G0x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y2(Test_G0x6y2, "G0x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x6y2C1Ev();
extern void _ZN6G0x6y2D1Ev();
Name_Map name_map_G0x6y2[] = {
  NSPAIR(_ZN6G0x6y2C1Ev),
  NSPAIR(_ZN6G0x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G0x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x6y2[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y2[] = {
  {&(_ZTV6G0x6y2[4]),  4,8},
  {&(_tg__ZTV4E0x6__6G0x6y2[3]),  3,3},
  {&(_ZTV6G0x6y2[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G0x6y2[];
extern  VTBL_ENTRY _ZTV6G0x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y2[];
Class_Descriptor cd_G0x6y2 = {  "G0x6y2", // class name
  bases_G0x6y2, 6,
  &(vtc_G0x6y2[0]), // expected_vtbl_contents
  &(vtt_G0x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y2),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y2),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y3  : virtual E0x6 , virtual F1 {
  int ff;
  ~G0x6y3(); // tgen
  G0x6y3(); // tgen
};
//SIG(1 G0x6y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x6y3 ::~G0x6y3(){ note_dtor("G0x6y3", this);} // tgen
G0x6y3 ::G0x6y3(){ note_ctor("G0x6y3", this);} // tgen

static void Test_G0x6y3()
{
  extern Class_Descriptor cd_G0x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x6y3, buf);
    G0x6y3 *dp, &lv = *(dp=new (buf) G0x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y3)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(24,12), "G0x6y3");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(28,16), "G0x6y3");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(24,12), "G0x6y3");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(40,28), "G0x6y3");
    check_base_class_offset(lv, (E0x6*), ABISELECT(16,8), "G0x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x6y3.ff");
    test_class_info(&lv, &cd_G0x6y3);
    dp->~G0x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y3(Test_G0x6y3, "G0x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G0x6y3C1Ev();
extern void _ZN6G0x6y3D1Ev();
Name_Map name_map_G0x6y3[] = {
  NSPAIR(_ZN6G0x6y3C1Ev),
  NSPAIR(_ZN6G0x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y3[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x6y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G0x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x6y3[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y3[] = {
  {&(_ZTV6G0x6y3[5]),  5,12},
  {&(_ZTV6G0x6y3[8]),  8,12},
  {&(_ZTV6G0x6y3[11]),  11,12},
  {&(_tg__ZTV4E0x6__6G0x6y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y3[];
extern  VTBL_ENTRY _ZTV6G0x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y3[];
Class_Descriptor cd_G0x6y3 = {  "G0x6y3", // class name
  bases_G0x6y3, 6,
  &(vtc_G0x6y3[0]), // expected_vtbl_contents
  &(vtt_G0x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G0x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y3),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y3),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y4  : E0x6 , F0 {
  int ff;
  ~G0x6y4(); // tgen
  G0x6y4(); // tgen
};
//SIG(1 G0x6y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G0x6y4 ::~G0x6y4(){ note_dtor("G0x6y4", this);} // tgen
G0x6y4 ::G0x6y4(){ note_ctor("G0x6y4", this);} // tgen

static void Test_G0x6y4()
{
  extern Class_Descriptor cd_G0x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x6y4, buf);
    G0x6y4 *dp, &lv = *(dp=new (buf) G0x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y4)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(8,4), "G0x6y4");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(12,8), "G0x6y4");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(8,4), "G0x6y4");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(32,28), "G0x6y4");
    check_base_class_offset(lv, (E0x6*), 0, "G0x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G0x6y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G0x6y4.ff");
    test_class_info(&lv, &cd_G0x6y4);
    dp->~G0x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y4(Test_G0x6y4, "G0x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x6y4C1Ev();
extern void _ZN6G0x6y4D1Ev();
Name_Map name_map_G0x6y4[] = {
  NSPAIR(_ZN6G0x6y4C1Ev),
  NSPAIR(_ZN6G0x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y4[];
static  VTBL_ENTRY vtc_G0x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y4[0]),
};
extern VTBL_ENTRY _ZTV6G0x6y4[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y4[] = {
  {&(_ZTV6G0x6y4[3]),  3,3},
  {&(_tg__ZTV4E0x6__6G0x6y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y4[];
extern  VTBL_ENTRY _ZTV6G0x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y4[];
Class_Descriptor cd_G0x6y4 = {  "G0x6y4", // class name
  bases_G0x6y4, 6,
  &(vtc_G0x6y4[0]), // expected_vtbl_contents
  &(vtt_G0x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y4),3, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y5  : virtual E0x6 , F0 {
  int ff;
  ~G0x6y5(); // tgen
  G0x6y5(); // tgen
};
//SIG(1 G0x6y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G0x6y5 ::~G0x6y5(){ note_dtor("G0x6y5", this);} // tgen
G0x6y5 ::G0x6y5(){ note_ctor("G0x6y5", this);} // tgen

static void Test_G0x6y5()
{
  extern Class_Descriptor cd_G0x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x6y5, buf);
    G0x6y5 *dp, &lv = *(dp=new (buf) G0x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y5)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(24,16), "G0x6y5");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(28,20), "G0x6y5");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(24,16), "G0x6y5");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(40,32), "G0x6y5");
    check_base_class_offset(lv, (E0x6*), ABISELECT(16,12), "G0x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x6y5.ff");
    test_class_info(&lv, &cd_G0x6y5);
    dp->~G0x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y5(Test_G0x6y5, "G0x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x6y5C1Ev();
extern void _ZN6G0x6y5D1Ev();
Name_Map name_map_G0x6y5[] = {
  NSPAIR(_ZN6G0x6y5C1Ev),
  NSPAIR(_ZN6G0x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y5[];
static  VTBL_ENTRY vtc_G0x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y5[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x6y5[0]),
};
extern VTBL_ENTRY _ZTV6G0x6y5[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y5[] = {
  {&(_ZTV6G0x6y5[4]),  4,7},
  {&(_ZTV6G0x6y5[7]),  7,7},
  {&(_tg__ZTV4E0x6__6G0x6y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y5[];
extern  VTBL_ENTRY _ZTV6G0x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y5[];
Class_Descriptor cd_G0x6y5 = {  "G0x6y5", // class name
  bases_G0x6y5, 6,
  &(vtc_G0x6y5[0]), // expected_vtbl_contents
  &(vtt_G0x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y5),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y6  : E0x6 , virtual F0 {
  int ff;
  ~G0x6y6(); // tgen
  G0x6y6(); // tgen
};
//SIG(1 G0x6y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x6y6 ::~G0x6y6(){ note_dtor("G0x6y6", this);} // tgen
G0x6y6 ::G0x6y6(){ note_ctor("G0x6y6", this);} // tgen

static void Test_G0x6y6()
{
  extern Class_Descriptor cd_G0x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x6y6, buf);
    G0x6y6 *dp, &lv = *(dp=new (buf) G0x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y6)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(8,4), "G0x6y6");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(12,8), "G0x6y6");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(8,4), "G0x6y6");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(28,24), "G0x6y6");
    check_base_class_offset(lv, (E0x6*), 0, "G0x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x6y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G0x6y6.ff");
    test_class_info(&lv, &cd_G0x6y6);
    dp->~G0x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y6(Test_G0x6y6, "G0x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x6y6C1Ev();
extern void _ZN6G0x6y6D1Ev();
Name_Map name_map_G0x6y6[] = {
  NSPAIR(_ZN6G0x6y6C1Ev),
  NSPAIR(_ZN6G0x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y6[];
static  VTBL_ENTRY vtc_G0x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y6[0]),
};
extern VTBL_ENTRY _ZTV6G0x6y6[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y6[] = {
  {&(_ZTV6G0x6y6[4]),  4,4},
  {&(_tg__ZTV4E0x6__6G0x6y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y6[];
extern  VTBL_ENTRY _ZTV6G0x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y6[];
Class_Descriptor cd_G0x6y6 = {  "G0x6y6", // class name
  bases_G0x6y6, 6,
  &(vtc_G0x6y6[0]), // expected_vtbl_contents
  &(vtt_G0x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y6),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x6y7  : virtual E0x6 , virtual F0 {
  int ff;
  ~G0x6y7(); // tgen
  G0x6y7(); // tgen
};
//SIG(1 G0x6y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x6y7 ::~G0x6y7(){ note_dtor("G0x6y7", this);} // tgen
G0x6y7 ::G0x6y7(){ note_ctor("G0x6y7", this);} // tgen

static void Test_G0x6y7()
{
  extern Class_Descriptor cd_G0x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x6y7, buf);
    G0x6y7 *dp, &lv = *(dp=new (buf) G0x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x6y7)");
    check_base_class_offset(lv, (A0*)(C0*)(E0x6*), ABISELECT(24,12), "G0x6y7");
    check_base_class_offset(lv, (B0*)(C0*)(E0x6*), ABISELECT(28,16), "G0x6y7");
    check_base_class_offset(lv, (C0*)(E0x6*), ABISELECT(24,12), "G0x6y7");
    check_base_class_offset(lv, (D0*)(E0x6*), ABISELECT(40,28), "G0x6y7");
    check_base_class_offset(lv, (E0x6*), ABISELECT(16,8), "G0x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x6y7.ff");
    test_class_info(&lv, &cd_G0x6y7);
    dp->~G0x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x6y7(Test_G0x6y7, "G0x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x6y7C1Ev();
extern void _ZN6G0x6y7D1Ev();
Name_Map name_map_G0x6y7[] = {
  NSPAIR(_ZN6G0x6y7C1Ev),
  NSPAIR(_ZN6G0x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x6;
extern VTBL_ENTRY _ZTI4E0x6[];
extern  VTBL_ENTRY _ZTV4E0x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x6y7[];
static  VTBL_ENTRY vtc_G0x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x6y7[0]),
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x6y7[0]),
};
extern VTBL_ENTRY _ZTV6G0x6y7[];
static  VTBL_ENTRY _tg__ZTV4E0x6__6G0x6y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x6[0]),
};
static  VTT_ENTRY vtt_G0x6y7[] = {
  {&(_ZTV6G0x6y7[5]),  5,8},
  {&(_ZTV6G0x6y7[8]),  8,8},
  {&(_tg__ZTV4E0x6__6G0x6y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G0x6y7[];
extern  VTBL_ENTRY _ZTV6G0x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x6y7[];
Class_Descriptor cd_G0x6y7 = {  "G0x6y7", // class name
  bases_G0x6y7, 6,
  &(vtc_G0x6y7[0]), // expected_vtbl_contents
  &(vtt_G0x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x6y7),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x6y7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E1x6  : C1 , virtual D0 {
  int fd;
  ~E1x6(); // tgen
  E1x6(); // tgen
};
//SIG(-1 E1x6) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E1x6 ::~E1x6(){ note_dtor("E1x6", this);} // tgen
E1x6 ::E1x6(){ note_ctor("E1x6", this);} // tgen

static void Test_E1x6()
{
  extern Class_Descriptor cd_E1x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E1x6, buf);
    E1x6 *dp, &lv = *(dp=new (buf) E1x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E1x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x6)");
    check_base_class_offset(lv, (A1*)(C1*), 0, "E1x6");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(12,8), "E1x6");
    check_base_class_offset(lv, (C1*), 0, "E1x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E1x6");
    check_field_offset(lv, fd, ABISELECT(20,16), "E1x6.fd");
    test_class_info(&lv, &cd_E1x6);
    dp->~E1x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x6(Test_E1x6, "E1x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E1x6C1Ev();
extern void _ZN4E1x6D1Ev();
Name_Map name_map_E1x6[] = {
  NSPAIR(_ZN4E1x6C1Ev),
  NSPAIR(_ZN4E1x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E1x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E1x6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E1x6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E1x6[];
static  VTT_ENTRY vtt_E1x6[] = {
  {&(_ZTV4E1x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
Class_Descriptor cd_E1x6 = {  "E1x6", // class name
  bases_E1x6, 4,
  &(vtc_E1x6[0]), // expected_vtbl_contents
  &(vtt_E1x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E1x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E1x6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E1x6),1, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y0  : E1x6 , F1 {
  int ff;
  ~G1x6y0(); // tgen
  G1x6y0(); // tgen
};
//SIG(1 G1x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x6y0 ::~G1x6y0(){ note_dtor("G1x6y0", this);} // tgen
G1x6y0 ::G1x6y0(){ note_ctor("G1x6y0", this);} // tgen

static void Test_G1x6y0()
{
  extern Class_Descriptor cd_G1x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x6y0, buf);
    G1x6y0 *dp, &lv = *(dp=new (buf) G1x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y0)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), 0, "G1x6y0");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(12,8), "G1x6y0");
    check_base_class_offset(lv, (C1*)(E1x6*), 0, "G1x6y0");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(40,32), "G1x6y0");
    check_base_class_offset(lv, (E1x6*), 0, "G1x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G1x6y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G1x6y0.ff");
    test_class_info(&lv, &cd_G1x6y0);
    dp->~G1x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y0(Test_G1x6y0, "G1x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x6y0C1Ev();
extern void _ZN6G1x6y0D1Ev();
Name_Map name_map_G1x6y0[] = {
  NSPAIR(_ZN6G1x6y0C1Ev),
  NSPAIR(_ZN6G1x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y0[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G1x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y0[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y0[] = {
  {&(_ZTV6G1x6y0[3]),  3,7},
  {&(_tg__ZTV4E1x6__6G1x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y0[];
extern  VTBL_ENTRY _ZTV6G1x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y0[];
Class_Descriptor cd_G1x6y0 = {  "G1x6y0", // class name
  bases_G1x6y0, 6,
  &(vtc_G1x6y0[0]), // expected_vtbl_contents
  &(vtt_G1x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y0),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y1  : virtual E1x6 , F1 {
  int ff;
  ~G1x6y1(); // tgen
  G1x6y1(); // tgen
};
//SIG(1 G1x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x6y1 ::~G1x6y1(){ note_dtor("G1x6y1", this);} // tgen
G1x6y1 ::G1x6y1(){ note_ctor("G1x6y1", this);} // tgen

static void Test_G1x6y1()
{
  extern Class_Descriptor cd_G1x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x6y1, buf);
    G1x6y1 *dp, &lv = *(dp=new (buf) G1x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y1)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), ABISELECT(16,12), "G1x6y1");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(28,20), "G1x6y1");
    check_base_class_offset(lv, (C1*)(E1x6*), ABISELECT(16,12), "G1x6y1");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(40,32), "G1x6y1");
    check_base_class_offset(lv, (E1x6*), ABISELECT(16,12), "G1x6y1");
    check_base_class_offset(lv, (F1*), 0, "G1x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x6y1.ff");
    test_class_info(&lv, &cd_G1x6y1);
    dp->~G1x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y1(Test_G1x6y1, "G1x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x6y1C1Ev();
extern void _ZN6G1x6y1D1Ev();
Name_Map name_map_G1x6y1[] = {
  NSPAIR(_ZN6G1x6y1C1Ev),
  NSPAIR(_ZN6G1x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y1[] = {
  {&(_ZTV6G1x6y1[4]),  4,10},
  {&(_ZTV6G1x6y1[9]),  9,10},
  {&(_tg__ZTV4E1x6__6G1x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y1[];
extern  VTBL_ENTRY _ZTV6G1x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y1[];
Class_Descriptor cd_G1x6y1 = {  "G1x6y1", // class name
  bases_G1x6y1, 6,
  &(vtc_G1x6y1[0]), // expected_vtbl_contents
  &(vtt_G1x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y1),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y2  : E1x6 , virtual F1 {
  int ff;
  ~G1x6y2(); // tgen
  G1x6y2(); // tgen
};
//SIG(1 G1x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x6y2 ::~G1x6y2(){ note_dtor("G1x6y2", this);} // tgen
G1x6y2 ::G1x6y2(){ note_ctor("G1x6y2", this);} // tgen

static void Test_G1x6y2()
{
  extern Class_Descriptor cd_G1x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x6y2, buf);
    G1x6y2 *dp, &lv = *(dp=new (buf) G1x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y2)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), 0, "G1x6y2");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(12,8), "G1x6y2");
    check_base_class_offset(lv, (C1*)(E1x6*), 0, "G1x6y2");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(28,24), "G1x6y2");
    check_base_class_offset(lv, (E1x6*), 0, "G1x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G1x6y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G1x6y2.ff");
    test_class_info(&lv, &cd_G1x6y2);
    dp->~G1x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y2(Test_G1x6y2, "G1x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x6y2C1Ev();
extern void _ZN6G1x6y2D1Ev();
Name_Map name_map_G1x6y2[] = {
  NSPAIR(_ZN6G1x6y2C1Ev),
  NSPAIR(_ZN6G1x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G1x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y2[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y2[] = {
  {&(_ZTV6G1x6y2[4]),  4,9},
  {&(_tg__ZTV4E1x6__6G1x6y2[3]),  3,4},
  {&(_ZTV6G1x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G1x6y2[];
extern  VTBL_ENTRY _ZTV6G1x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y2[];
Class_Descriptor cd_G1x6y2 = {  "G1x6y2", // class name
  bases_G1x6y2, 6,
  &(vtc_G1x6y2[0]), // expected_vtbl_contents
  &(vtt_G1x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y2),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y3  : virtual E1x6 , virtual F1 {
  int ff;
  ~G1x6y3(); // tgen
  G1x6y3(); // tgen
};
//SIG(1 G1x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x6y3 ::~G1x6y3(){ note_dtor("G1x6y3", this);} // tgen
G1x6y3 ::G1x6y3(){ note_ctor("G1x6y3", this);} // tgen

static void Test_G1x6y3()
{
  extern Class_Descriptor cd_G1x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x6y3, buf);
    G1x6y3 *dp, &lv = *(dp=new (buf) G1x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y3)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), ABISELECT(16,8), "G1x6y3");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(28,16), "G1x6y3");
    check_base_class_offset(lv, (C1*)(E1x6*), ABISELECT(16,8), "G1x6y3");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(40,28), "G1x6y3");
    check_base_class_offset(lv, (E1x6*), ABISELECT(16,8), "G1x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G1x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x6y3.ff");
    test_class_info(&lv, &cd_G1x6y3);
    dp->~G1x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y3(Test_G1x6y3, "G1x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G1x6y3C1Ev();
extern void _ZN6G1x6y3D1Ev();
Name_Map name_map_G1x6y3[] = {
  NSPAIR(_ZN6G1x6y3C1Ev),
  NSPAIR(_ZN6G1x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G1x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y3[] = {
  {&(_ZTV6G1x6y3[5]),  5,14},
  {&(_ZTV6G1x6y3[9]),  9,14},
  {&(_ZTV6G1x6y3[13]),  13,14},
  {&(_tg__ZTV4E1x6__6G1x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y3[];
extern  VTBL_ENTRY _ZTV6G1x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y3[];
Class_Descriptor cd_G1x6y3 = {  "G1x6y3", // class name
  bases_G1x6y3, 6,
  &(vtc_G1x6y3[0]), // expected_vtbl_contents
  &(vtt_G1x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G1x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y3),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y4  : E1x6 , F0 {
  int ff;
  ~G1x6y4(); // tgen
  G1x6y4(); // tgen
};
//SIG(1 G1x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G1x6y4 ::~G1x6y4(){ note_dtor("G1x6y4", this);} // tgen
G1x6y4 ::G1x6y4(){ note_ctor("G1x6y4", this);} // tgen

static void Test_G1x6y4()
{
  extern Class_Descriptor cd_G1x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x6y4, buf);
    G1x6y4 *dp, &lv = *(dp=new (buf) G1x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y4)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), 0, "G1x6y4");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(12,8), "G1x6y4");
    check_base_class_offset(lv, (C1*)(E1x6*), 0, "G1x6y4");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(32,28), "G1x6y4");
    check_base_class_offset(lv, (E1x6*), 0, "G1x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G1x6y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G1x6y4.ff");
    test_class_info(&lv, &cd_G1x6y4);
    dp->~G1x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y4(Test_G1x6y4, "G1x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G1x6y4C1Ev();
extern void _ZN6G1x6y4D1Ev();
Name_Map name_map_G1x6y4[] = {
  NSPAIR(_ZN6G1x6y4C1Ev),
  NSPAIR(_ZN6G1x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y4[] = {
  {&(_ZTV6G1x6y4[3]),  3,4},
  {&(_tg__ZTV4E1x6__6G1x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y4[];
extern  VTBL_ENTRY _ZTV6G1x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y4[];
Class_Descriptor cd_G1x6y4 = {  "G1x6y4", // class name
  bases_G1x6y4, 6,
  &(vtc_G1x6y4[0]), // expected_vtbl_contents
  &(vtt_G1x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G1x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y4),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y5  : virtual E1x6 , F0 {
  int ff;
  ~G1x6y5(); // tgen
  G1x6y5(); // tgen
};
//SIG(1 G1x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G1x6y5 ::~G1x6y5(){ note_dtor("G1x6y5", this);} // tgen
G1x6y5 ::G1x6y5(){ note_ctor("G1x6y5", this);} // tgen

static void Test_G1x6y5()
{
  extern Class_Descriptor cd_G1x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x6y5, buf);
    G1x6y5 *dp, &lv = *(dp=new (buf) G1x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y5)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), ABISELECT(16,12), "G1x6y5");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(28,20), "G1x6y5");
    check_base_class_offset(lv, (C1*)(E1x6*), ABISELECT(16,12), "G1x6y5");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(40,32), "G1x6y5");
    check_base_class_offset(lv, (E1x6*), ABISELECT(16,12), "G1x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x6y5.ff");
    test_class_info(&lv, &cd_G1x6y5);
    dp->~G1x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y5(Test_G1x6y5, "G1x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x6y5C1Ev();
extern void _ZN6G1x6y5D1Ev();
Name_Map name_map_G1x6y5[] = {
  NSPAIR(_ZN6G1x6y5C1Ev),
  NSPAIR(_ZN6G1x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y5[] = {
  {&(_ZTV6G1x6y5[4]),  4,9},
  {&(_ZTV6G1x6y5[8]),  8,9},
  {&(_tg__ZTV4E1x6__6G1x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y5[];
extern  VTBL_ENTRY _ZTV6G1x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y5[];
Class_Descriptor cd_G1x6y5 = {  "G1x6y5", // class name
  bases_G1x6y5, 6,
  &(vtc_G1x6y5[0]), // expected_vtbl_contents
  &(vtt_G1x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y5),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y6  : E1x6 , virtual F0 {
  int ff;
  ~G1x6y6(); // tgen
  G1x6y6(); // tgen
};
//SIG(1 G1x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x6y6 ::~G1x6y6(){ note_dtor("G1x6y6", this);} // tgen
G1x6y6 ::G1x6y6(){ note_ctor("G1x6y6", this);} // tgen

static void Test_G1x6y6()
{
  extern Class_Descriptor cd_G1x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G1x6y6, buf);
    G1x6y6 *dp, &lv = *(dp=new (buf) G1x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G1x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y6)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), 0, "G1x6y6");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(12,8), "G1x6y6");
    check_base_class_offset(lv, (C1*)(E1x6*), 0, "G1x6y6");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(28,24), "G1x6y6");
    check_base_class_offset(lv, (E1x6*), 0, "G1x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G1x6y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G1x6y6.ff");
    test_class_info(&lv, &cd_G1x6y6);
    dp->~G1x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y6(Test_G1x6y6, "G1x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G1x6y6C1Ev();
extern void _ZN6G1x6y6D1Ev();
Name_Map name_map_G1x6y6[] = {
  NSPAIR(_ZN6G1x6y6C1Ev),
  NSPAIR(_ZN6G1x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y6[] = {
  {&(_ZTV6G1x6y6[4]),  4,5},
  {&(_tg__ZTV4E1x6__6G1x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y6[];
extern  VTBL_ENTRY _ZTV6G1x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y6[];
Class_Descriptor cd_G1x6y6 = {  "G1x6y6", // class name
  bases_G1x6y6, 6,
  &(vtc_G1x6y6[0]), // expected_vtbl_contents
  &(vtt_G1x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G1x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y6),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x6y7  : virtual E1x6 , virtual F0 {
  int ff;
  ~G1x6y7(); // tgen
  G1x6y7(); // tgen
};
//SIG(1 G1x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x6y7 ::~G1x6y7(){ note_dtor("G1x6y7", this);} // tgen
G1x6y7 ::G1x6y7(){ note_ctor("G1x6y7", this);} // tgen

static void Test_G1x6y7()
{
  extern Class_Descriptor cd_G1x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x6y7, buf);
    G1x6y7 *dp, &lv = *(dp=new (buf) G1x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x6y7)");
    check_base_class_offset(lv, (A1*)(C1*)(E1x6*), ABISELECT(16,8), "G1x6y7");
    check_base_class_offset(lv, (B0*)(C1*)(E1x6*), ABISELECT(28,16), "G1x6y7");
    check_base_class_offset(lv, (C1*)(E1x6*), ABISELECT(16,8), "G1x6y7");
    check_base_class_offset(lv, (D0*)(E1x6*), ABISELECT(40,28), "G1x6y7");
    check_base_class_offset(lv, (E1x6*), ABISELECT(16,8), "G1x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G1x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x6y7.ff");
    test_class_info(&lv, &cd_G1x6y7);
    dp->~G1x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x6y7(Test_G1x6y7, "G1x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x6y7C1Ev();
extern void _ZN6G1x6y7D1Ev();
Name_Map name_map_G1x6y7[] = {
  NSPAIR(_ZN6G1x6y7C1Ev),
  NSPAIR(_ZN6G1x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x6;
extern VTBL_ENTRY _ZTI4E1x6[];
extern  VTBL_ENTRY _ZTV4E1x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E1x6__6G1x6y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x6y7[] = {
  {&(_ZTV6G1x6y7[5]),  5,10},
  {&(_ZTV6G1x6y7[9]),  9,10},
  {&(_tg__ZTV4E1x6__6G1x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x6y7[];
extern  VTBL_ENTRY _ZTV6G1x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x6y7[];
Class_Descriptor cd_G1x6y7 = {  "G1x6y7", // class name
  bases_G1x6y7, 6,
  &(vtc_G1x6y7[0]), // expected_vtbl_contents
  &(vtt_G1x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x6y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x6y7),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E2x6  : C2 , virtual D0 {
  int fd;
  ~E2x6(); // tgen
  E2x6(); // tgen
};
//SIG(-1 E2x6) C1{ BC2{ VBC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E2x6 ::~E2x6(){ note_dtor("E2x6", this);} // tgen
E2x6 ::E2x6(){ note_ctor("E2x6", this);} // tgen

static void Test_E2x6()
{
  extern Class_Descriptor cd_E2x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E2x6, buf);
    E2x6 *dp, &lv = *(dp=new (buf) E2x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E2x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x6)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(20,16), "E2x6");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(8,4), "E2x6");
    check_base_class_offset(lv, (C2*), 0, "E2x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E2x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E2x6.fd");
    test_class_info(&lv, &cd_E2x6);
    dp->~E2x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x6(Test_E2x6, "E2x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E2x6C1Ev();
extern void _ZN4E2x6D1Ev();
Name_Map name_map_E2x6[] = {
  NSPAIR(_ZN4E2x6C1Ev),
  NSPAIR(_ZN4E2x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E2x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E2x6[];
static  VTBL_ENTRY vtc_E2x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
extern VTBL_ENTRY _ZTV4E2x6[];
static  VTBL_ENTRY _tg__ZTV2C2__4E2x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x6[] = {
  {&(_ZTV4E2x6[4]),  4,4},
  {&(_tg__ZTV2C2__4E2x6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
Class_Descriptor cd_E2x6 = {  "E2x6", // class name
  bases_E2x6, 4,
  &(vtc_E2x6[0]), // expected_vtbl_contents
  &(vtt_E2x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E2x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E2x6),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E2x6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y0  : E2x6 , F1 {
  int ff;
  ~G2x6y0(); // tgen
  G2x6y0(); // tgen
};
//SIG(1 G2x6y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x6y0 ::~G2x6y0(){ note_dtor("G2x6y0", this);} // tgen
G2x6y0 ::G2x6y0(){ note_ctor("G2x6y0", this);} // tgen

static void Test_G2x6y0()
{
  extern Class_Descriptor cd_G2x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x6y0, buf);
    G2x6y0 *dp, &lv = *(dp=new (buf) G2x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y0)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(40,28), "G2x6y0");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(8,4), "G2x6y0");
    check_base_class_offset(lv, (C2*)(E2x6*), 0, "G2x6y0");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(44,32), "G2x6y0");
    check_base_class_offset(lv, (E2x6*), 0, "G2x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G2x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G2x6y0.ff");
    test_class_info(&lv, &cd_G2x6y0);
    dp->~G2x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y0(Test_G2x6y0, "G2x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x6y0C1Ev();
extern void _ZN6G2x6y0D1Ev();
Name_Map name_map_G2x6y0[] = {
  NSPAIR(_ZN6G2x6y0C1Ev),
  NSPAIR(_ZN6G2x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G2x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x6y0[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y0[] = {
  {&(_ZTV6G2x6y0[4]),  4,7},
  {&(_tg__ZTV4E2x6__6G2x6y0[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y0[];
extern  VTBL_ENTRY _ZTV6G2x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y0[];
Class_Descriptor cd_G2x6y0 = {  "G2x6y0", // class name
  bases_G2x6y0, 6,
  &(vtc_G2x6y0[0]), // expected_vtbl_contents
  &(vtt_G2x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y0),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y1  : virtual E2x6 , F1 {
  int ff;
  ~G2x6y1(); // tgen
  G2x6y1(); // tgen
};
//SIG(1 G2x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x6y1 ::~G2x6y1(){ note_dtor("G2x6y1", this);} // tgen
G2x6y1 ::G2x6y1(){ note_ctor("G2x6y1", this);} // tgen

static void Test_G2x6y1()
{
  extern Class_Descriptor cd_G2x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x6y1, buf);
    G2x6y1 *dp, &lv = *(dp=new (buf) G2x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y1)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(36,28), "G2x6y1");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(24,16), "G2x6y1");
    check_base_class_offset(lv, (C2*)(E2x6*), ABISELECT(16,12), "G2x6y1");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(40,32), "G2x6y1");
    check_base_class_offset(lv, (E2x6*), ABISELECT(16,12), "G2x6y1");
    check_base_class_offset(lv, (F1*), 0, "G2x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x6y1.ff");
    test_class_info(&lv, &cd_G2x6y1);
    dp->~G2x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y1(Test_G2x6y1, "G2x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x6y1C1Ev();
extern void _ZN6G2x6y1D1Ev();
Name_Map name_map_G2x6y1[] = {
  NSPAIR(_ZN6G2x6y1C1Ev),
  NSPAIR(_ZN6G2x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x6y1[0]),
};
extern VTBL_ENTRY _ZTV6G2x6y1[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y1[] = {
  {&(_ZTV6G2x6y1[5]),  5,10},
  {&(_ZTV6G2x6y1[10]),  10,10},
  {&(_tg__ZTV4E2x6__6G2x6y1[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y1[];
extern  VTBL_ENTRY _ZTV6G2x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y1[];
Class_Descriptor cd_G2x6y1 = {  "G2x6y1", // class name
  bases_G2x6y1, 6,
  &(vtc_G2x6y1[0]), // expected_vtbl_contents
  &(vtt_G2x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y1),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y2  : E2x6 , virtual F1 {
  int ff;
  ~G2x6y2(); // tgen
  G2x6y2(); // tgen
};
//SIG(1 G2x6y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x6y2 ::~G2x6y2(){ note_dtor("G2x6y2", this);} // tgen
G2x6y2 ::G2x6y2(){ note_ctor("G2x6y2", this);} // tgen

static void Test_G2x6y2()
{
  extern Class_Descriptor cd_G2x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x6y2, buf);
    G2x6y2 *dp, &lv = *(dp=new (buf) G2x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y2)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(24,20), "G2x6y2");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(8,4), "G2x6y2");
    check_base_class_offset(lv, (C2*)(E2x6*), 0, "G2x6y2");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(28,24), "G2x6y2");
    check_base_class_offset(lv, (E2x6*), 0, "G2x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G2x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G2x6y2.ff");
    test_class_info(&lv, &cd_G2x6y2);
    dp->~G2x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y2(Test_G2x6y2, "G2x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x6y2C1Ev();
extern void _ZN6G2x6y2D1Ev();
Name_Map name_map_G2x6y2[] = {
  NSPAIR(_ZN6G2x6y2C1Ev),
  NSPAIR(_ZN6G2x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G2x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x6y2[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y2[] = {
  {&(_ZTV6G2x6y2[5]),  5,9},
  {&(_tg__ZTV4E2x6__6G2x6y2[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y2[3]),  3,3},
  {&(_ZTV6G2x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G2x6y2[];
extern  VTBL_ENTRY _ZTV6G2x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y2[];
Class_Descriptor cd_G2x6y2 = {  "G2x6y2", // class name
  bases_G2x6y2, 6,
  &(vtc_G2x6y2[0]), // expected_vtbl_contents
  &(vtt_G2x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y2),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y3  : virtual E2x6 , virtual F1 {
  int ff;
  ~G2x6y3(); // tgen
  G2x6y3(); // tgen
};
//SIG(1 G2x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x6y3 ::~G2x6y3(){ note_dtor("G2x6y3", this);} // tgen
G2x6y3 ::G2x6y3(){ note_ctor("G2x6y3", this);} // tgen

static void Test_G2x6y3()
{
  extern Class_Descriptor cd_G2x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x6y3, buf);
    G2x6y3 *dp, &lv = *(dp=new (buf) G2x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y3)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(36,24), "G2x6y3");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(24,12), "G2x6y3");
    check_base_class_offset(lv, (C2*)(E2x6*), ABISELECT(16,8), "G2x6y3");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(40,28), "G2x6y3");
    check_base_class_offset(lv, (E2x6*), ABISELECT(16,8), "G2x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G2x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x6y3.ff");
    test_class_info(&lv, &cd_G2x6y3);
    dp->~G2x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y3(Test_G2x6y3, "G2x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G2x6y3C1Ev();
extern void _ZN6G2x6y3D1Ev();
Name_Map name_map_G2x6y3[] = {
  NSPAIR(_ZN6G2x6y3C1Ev),
  NSPAIR(_ZN6G2x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y3[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x6y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G2x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x6y3[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y3[] = {
  {&(_ZTV6G2x6y3[6]),  6,14},
  {&(_ZTV6G2x6y3[10]),  10,14},
  {&(_ZTV6G2x6y3[13]),  13,14},
  {&(_tg__ZTV4E2x6__6G2x6y3[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y3[];
extern  VTBL_ENTRY _ZTV6G2x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y3[];
Class_Descriptor cd_G2x6y3 = {  "G2x6y3", // class name
  bases_G2x6y3, 6,
  &(vtc_G2x6y3[0]), // expected_vtbl_contents
  &(vtt_G2x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G2x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y3),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y4  : E2x6 , F0 {
  int ff;
  ~G2x6y4(); // tgen
  G2x6y4(); // tgen
};
//SIG(1 G2x6y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G2x6y4 ::~G2x6y4(){ note_dtor("G2x6y4", this);} // tgen
G2x6y4 ::G2x6y4(){ note_ctor("G2x6y4", this);} // tgen

static void Test_G2x6y4()
{
  extern Class_Descriptor cd_G2x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x6y4, buf);
    G2x6y4 *dp, &lv = *(dp=new (buf) G2x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y4)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(28,24), "G2x6y4");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(8,4), "G2x6y4");
    check_base_class_offset(lv, (C2*)(E2x6*), 0, "G2x6y4");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(32,28), "G2x6y4");
    check_base_class_offset(lv, (E2x6*), 0, "G2x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G2x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G2x6y4.ff");
    test_class_info(&lv, &cd_G2x6y4);
    dp->~G2x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y4(Test_G2x6y4, "G2x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G2x6y4C1Ev();
extern void _ZN6G2x6y4D1Ev();
Name_Map name_map_G2x6y4[] = {
  NSPAIR(_ZN6G2x6y4C1Ev),
  NSPAIR(_ZN6G2x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y4[];
static  VTBL_ENTRY vtc_G2x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y4[0]),
};
extern VTBL_ENTRY _ZTV6G2x6y4[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y4[] = {
  {&(_ZTV6G2x6y4[4]),  4,4},
  {&(_tg__ZTV4E2x6__6G2x6y4[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y4[];
extern  VTBL_ENTRY _ZTV6G2x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y4[];
Class_Descriptor cd_G2x6y4 = {  "G2x6y4", // class name
  bases_G2x6y4, 6,
  &(vtc_G2x6y4[0]), // expected_vtbl_contents
  &(vtt_G2x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G2x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y4),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y5  : virtual E2x6 , F0 {
  int ff;
  ~G2x6y5(); // tgen
  G2x6y5(); // tgen
};
//SIG(1 G2x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G2x6y5 ::~G2x6y5(){ note_dtor("G2x6y5", this);} // tgen
G2x6y5 ::G2x6y5(){ note_ctor("G2x6y5", this);} // tgen

static void Test_G2x6y5()
{
  extern Class_Descriptor cd_G2x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x6y5, buf);
    G2x6y5 *dp, &lv = *(dp=new (buf) G2x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y5)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(36,28), "G2x6y5");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(24,16), "G2x6y5");
    check_base_class_offset(lv, (C2*)(E2x6*), ABISELECT(16,12), "G2x6y5");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(40,32), "G2x6y5");
    check_base_class_offset(lv, (E2x6*), ABISELECT(16,12), "G2x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x6y5.ff");
    test_class_info(&lv, &cd_G2x6y5);
    dp->~G2x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y5(Test_G2x6y5, "G2x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x6y5C1Ev();
extern void _ZN6G2x6y5D1Ev();
Name_Map name_map_G2x6y5[] = {
  NSPAIR(_ZN6G2x6y5C1Ev),
  NSPAIR(_ZN6G2x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y5[];
static  VTBL_ENTRY vtc_G2x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y5[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x6y5[0]),
};
extern VTBL_ENTRY _ZTV6G2x6y5[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y5[] = {
  {&(_ZTV6G2x6y5[5]),  5,9},
  {&(_ZTV6G2x6y5[9]),  9,9},
  {&(_tg__ZTV4E2x6__6G2x6y5[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y5[];
extern  VTBL_ENTRY _ZTV6G2x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y5[];
Class_Descriptor cd_G2x6y5 = {  "G2x6y5", // class name
  bases_G2x6y5, 6,
  &(vtc_G2x6y5[0]), // expected_vtbl_contents
  &(vtt_G2x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y5),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y6  : E2x6 , virtual F0 {
  int ff;
  ~G2x6y6(); // tgen
  G2x6y6(); // tgen
};
//SIG(1 G2x6y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x6y6 ::~G2x6y6(){ note_dtor("G2x6y6", this);} // tgen
G2x6y6 ::G2x6y6(){ note_ctor("G2x6y6", this);} // tgen

static void Test_G2x6y6()
{
  extern Class_Descriptor cd_G2x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G2x6y6, buf);
    G2x6y6 *dp, &lv = *(dp=new (buf) G2x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G2x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y6)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(24,20), "G2x6y6");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(8,4), "G2x6y6");
    check_base_class_offset(lv, (C2*)(E2x6*), 0, "G2x6y6");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(28,24), "G2x6y6");
    check_base_class_offset(lv, (E2x6*), 0, "G2x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G2x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G2x6y6.ff");
    test_class_info(&lv, &cd_G2x6y6);
    dp->~G2x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y6(Test_G2x6y6, "G2x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G2x6y6C1Ev();
extern void _ZN6G2x6y6D1Ev();
Name_Map name_map_G2x6y6[] = {
  NSPAIR(_ZN6G2x6y6C1Ev),
  NSPAIR(_ZN6G2x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y6[];
static  VTBL_ENTRY vtc_G2x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y6[0]),
};
extern VTBL_ENTRY _ZTV6G2x6y6[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y6[] = {
  {&(_ZTV6G2x6y6[5]),  5,5},
  {&(_tg__ZTV4E2x6__6G2x6y6[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y6[];
extern  VTBL_ENTRY _ZTV6G2x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y6[];
Class_Descriptor cd_G2x6y6 = {  "G2x6y6", // class name
  bases_G2x6y6, 6,
  &(vtc_G2x6y6[0]), // expected_vtbl_contents
  &(vtt_G2x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G2x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y6),5, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x6y7  : virtual E2x6 , virtual F0 {
  int ff;
  ~G2x6y7(); // tgen
  G2x6y7(); // tgen
};
//SIG(1 G2x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x6y7 ::~G2x6y7(){ note_dtor("G2x6y7", this);} // tgen
G2x6y7 ::G2x6y7(){ note_ctor("G2x6y7", this);} // tgen

static void Test_G2x6y7()
{
  extern Class_Descriptor cd_G2x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x6y7, buf);
    G2x6y7 *dp, &lv = *(dp=new (buf) G2x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x6y7)");
    check_base_class_offset(lv, (A0*)(C2*)(E2x6*), ABISELECT(36,24), "G2x6y7");
    check_base_class_offset(lv, (B0*)(C2*)(E2x6*), ABISELECT(24,12), "G2x6y7");
    check_base_class_offset(lv, (C2*)(E2x6*), ABISELECT(16,8), "G2x6y7");
    check_base_class_offset(lv, (D0*)(E2x6*), ABISELECT(40,28), "G2x6y7");
    check_base_class_offset(lv, (E2x6*), ABISELECT(16,8), "G2x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G2x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x6y7.ff");
    test_class_info(&lv, &cd_G2x6y7);
    dp->~G2x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x6y7(Test_G2x6y7, "G2x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x6y7C1Ev();
extern void _ZN6G2x6y7D1Ev();
Name_Map name_map_G2x6y7[] = {
  NSPAIR(_ZN6G2x6y7C1Ev),
  NSPAIR(_ZN6G2x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x6;
extern VTBL_ENTRY _ZTI4E2x6[];
extern  VTBL_ENTRY _ZTV4E2x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x6y7[];
static  VTBL_ENTRY vtc_G2x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x6y7[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x6y7[0]),
};
extern VTBL_ENTRY _ZTV6G2x6y7[];
static  VTBL_ENTRY _tg__ZTV4E2x6__6G2x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C24E2x6__6G2x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x6y7[] = {
  {&(_ZTV6G2x6y7[6]),  6,10},
  {&(_ZTV6G2x6y7[10]),  10,10},
  {&(_tg__ZTV4E2x6__6G2x6y7[4]),  4,4},
  {&(_tg__ZTV2C24E2x6__6G2x6y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x6y7[];
extern  VTBL_ENTRY _ZTV6G2x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x6y7[];
Class_Descriptor cd_G2x6y7 = {  "G2x6y7", // class name
  bases_G2x6y7, 6,
  &(vtc_G2x6y7[0]), // expected_vtbl_contents
  &(vtt_G2x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x6y7),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x6y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E3x6  : C3 , virtual D0 {
  int fd;
  ~E3x6(); // tgen
  E3x6(); // tgen
};
//SIG(-1 E3x6) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E3x6 ::~E3x6(){ note_dtor("E3x6", this);} // tgen
E3x6 ::E3x6(){ note_ctor("E3x6", this);} // tgen

static void Test_E3x6()
{
  extern Class_Descriptor cd_E3x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E3x6, buf);
    E3x6 *dp, &lv = *(dp=new (buf) E3x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E3x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x6)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(24,16), "E3x6");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(8,4), "E3x6");
    check_base_class_offset(lv, (C3*), 0, "E3x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E3x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E3x6.fd");
    test_class_info(&lv, &cd_E3x6);
    dp->~E3x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x6(Test_E3x6, "E3x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E3x6C1Ev();
extern void _ZN4E3x6D1Ev();
Name_Map name_map_E3x6[] = {
  NSPAIR(_ZN4E3x6C1Ev),
  NSPAIR(_ZN4E3x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E3x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E3x6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E3x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E3x6[];
static  VTBL_ENTRY _tg__ZTV2C3__4E3x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__4E3x6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x6[] = {
  {&(_ZTV4E3x6[4]),  4,8},
  {&(_tg__ZTV2C3__4E3x6[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__4E3x6[3]),  3,4},
  {&(_ZTV4E3x6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
Class_Descriptor cd_E3x6 = {  "E3x6", // class name
  bases_E3x6, 4,
  &(vtc_E3x6[0]), // expected_vtbl_contents
  &(vtt_E3x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E3x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E3x6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E3x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y0  : E3x6 , F1 {
  int ff;
  ~G3x6y0(); // tgen
  G3x6y0(); // tgen
};
//SIG(1 G3x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x6y0 ::~G3x6y0(){ note_dtor("G3x6y0", this);} // tgen
G3x6y0 ::G3x6y0(){ note_ctor("G3x6y0", this);} // tgen

static void Test_G3x6y0()
{
  extern Class_Descriptor cd_G3x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x6y0, buf);
    G3x6y0 *dp, &lv = *(dp=new (buf) G3x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y0)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(40,28), "G3x6y0");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(8,4), "G3x6y0");
    check_base_class_offset(lv, (C3*)(E3x6*), 0, "G3x6y0");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(52,36), "G3x6y0");
    check_base_class_offset(lv, (E3x6*), 0, "G3x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G3x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G3x6y0.ff");
    test_class_info(&lv, &cd_G3x6y0);
    dp->~G3x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y0(Test_G3x6y0, "G3x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x6y0C1Ev();
extern void _ZN6G3x6y0D1Ev();
Name_Map name_map_G3x6y0[] = {
  NSPAIR(_ZN6G3x6y0C1Ev),
  NSPAIR(_ZN6G3x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G3x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y0[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y0[] = {
  {&(_ZTV6G3x6y0[4]),  4,11},
  {&(_tg__ZTV4E3x6__6G3x6y0[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y0[3]),  3,4},
  {&(_ZTV6G3x6y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G3x6y0[];
extern  VTBL_ENTRY _ZTV6G3x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y0[];
Class_Descriptor cd_G3x6y0 = {  "G3x6y0", // class name
  bases_G3x6y0, 6,
  &(vtc_G3x6y0[0]), // expected_vtbl_contents
  &(vtt_G3x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y1  : virtual E3x6 , F1 {
  int ff;
  ~G3x6y1(); // tgen
  G3x6y1(); // tgen
};
//SIG(1 G3x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x6y1 ::~G3x6y1(){ note_dtor("G3x6y1", this);} // tgen
G3x6y1 ::G3x6y1(){ note_ctor("G3x6y1", this);} // tgen

static void Test_G3x6y1()
{
  extern Class_Descriptor cd_G3x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x6y1, buf);
    G3x6y1 *dp, &lv = *(dp=new (buf) G3x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y1)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(40,28), "G3x6y1");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(24,16), "G3x6y1");
    check_base_class_offset(lv, (C3*)(E3x6*), ABISELECT(16,12), "G3x6y1");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(52,36), "G3x6y1");
    check_base_class_offset(lv, (E3x6*), ABISELECT(16,12), "G3x6y1");
    check_base_class_offset(lv, (F1*), 0, "G3x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x6y1.ff");
    test_class_info(&lv, &cd_G3x6y1);
    dp->~G3x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y1(Test_G3x6y1, "G3x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x6y1C1Ev();
extern void _ZN6G3x6y1D1Ev();
Name_Map name_map_G3x6y1[] = {
  NSPAIR(_ZN6G3x6y1C1Ev),
  NSPAIR(_ZN6G3x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x6y1[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y1[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y1[] = {
  {&(_ZTV6G3x6y1[5]),  5,14},
  {&(_ZTV6G3x6y1[10]),  10,14},
  {&(_ZTV6G3x6y1[13]),  13,14},
  {&(_tg__ZTV4E3x6__6G3x6y1[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x6y1[];
extern  VTBL_ENTRY _ZTV6G3x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y1[];
Class_Descriptor cd_G3x6y1 = {  "G3x6y1", // class name
  bases_G3x6y1, 6,
  &(vtc_G3x6y1[0]), // expected_vtbl_contents
  &(vtt_G3x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y2  : E3x6 , virtual F1 {
  int ff;
  ~G3x6y2(); // tgen
  G3x6y2(); // tgen
};
//SIG(1 G3x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x6y2 ::~G3x6y2(){ note_dtor("G3x6y2", this);} // tgen
G3x6y2 ::G3x6y2(){ note_ctor("G3x6y2", this);} // tgen

static void Test_G3x6y2()
{
  extern Class_Descriptor cd_G3x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x6y2, buf);
    G3x6y2 *dp, &lv = *(dp=new (buf) G3x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y2)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(24,20), "G3x6y2");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(8,4), "G3x6y2");
    check_base_class_offset(lv, (C3*)(E3x6*), 0, "G3x6y2");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(36,28), "G3x6y2");
    check_base_class_offset(lv, (E3x6*), 0, "G3x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G3x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G3x6y2.ff");
    test_class_info(&lv, &cd_G3x6y2);
    dp->~G3x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y2(Test_G3x6y2, "G3x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x6y2C1Ev();
extern void _ZN6G3x6y2D1Ev();
Name_Map name_map_G3x6y2[] = {
  NSPAIR(_ZN6G3x6y2C1Ev),
  NSPAIR(_ZN6G3x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y2[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G3x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G3x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y2[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y2[] = {
  {&(_ZTV6G3x6y2[5]),  5,13},
  {&(_tg__ZTV4E3x6__6G3x6y2[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y2[3]),  3,4},
  {&(_ZTV6G3x6y2[8]),  8,13},
  {&(_ZTV6G3x6y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6G3x6y2[];
extern  VTBL_ENTRY _ZTV6G3x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y2[];
Class_Descriptor cd_G3x6y2 = {  "G3x6y2", // class name
  bases_G3x6y2, 6,
  &(vtc_G3x6y2[0]), // expected_vtbl_contents
  &(vtt_G3x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y3  : virtual E3x6 , virtual F1 {
  int ff;
  ~G3x6y3(); // tgen
  G3x6y3(); // tgen
};
//SIG(1 G3x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x6y3 ::~G3x6y3(){ note_dtor("G3x6y3", this);} // tgen
G3x6y3 ::G3x6y3(){ note_ctor("G3x6y3", this);} // tgen

static void Test_G3x6y3()
{
  extern Class_Descriptor cd_G3x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x6y3, buf);
    G3x6y3 *dp, &lv = *(dp=new (buf) G3x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y3)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(40,24), "G3x6y3");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(24,12), "G3x6y3");
    check_base_class_offset(lv, (C3*)(E3x6*), ABISELECT(16,8), "G3x6y3");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(52,32), "G3x6y3");
    check_base_class_offset(lv, (E3x6*), ABISELECT(16,8), "G3x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G3x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x6y3.ff");
    test_class_info(&lv, &cd_G3x6y3);
    dp->~G3x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y3(Test_G3x6y3, "G3x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G3x6y3C1Ev();
extern void _ZN6G3x6y3D1Ev();
Name_Map name_map_G3x6y3[] = {
  NSPAIR(_ZN6G3x6y3C1Ev),
  NSPAIR(_ZN6G3x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y3[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x6y3[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G3x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G3x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y3[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y3[] = {
  {&(_ZTV6G3x6y3[6]),  6,18},
  {&(_ZTV6G3x6y3[10]),  10,18},
  {&(_ZTV6G3x6y3[13]),  13,18},
  {&(_ZTV6G3x6y3[17]),  17,18},
  {&(_tg__ZTV4E3x6__6G3x6y3[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x6y3[];
extern  VTBL_ENTRY _ZTV6G3x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y3[];
Class_Descriptor cd_G3x6y3 = {  "G3x6y3", // class name
  bases_G3x6y3, 6,
  &(vtc_G3x6y3[0]), // expected_vtbl_contents
  &(vtt_G3x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G3x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y4  : E3x6 , F0 {
  int ff;
  ~G3x6y4(); // tgen
  G3x6y4(); // tgen
};
//SIG(1 G3x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G3x6y4 ::~G3x6y4(){ note_dtor("G3x6y4", this);} // tgen
G3x6y4 ::G3x6y4(){ note_ctor("G3x6y4", this);} // tgen

static void Test_G3x6y4()
{
  extern Class_Descriptor cd_G3x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x6y4, buf);
    G3x6y4 *dp, &lv = *(dp=new (buf) G3x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y4)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(32,24), "G3x6y4");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(8,4), "G3x6y4");
    check_base_class_offset(lv, (C3*)(E3x6*), 0, "G3x6y4");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(44,32), "G3x6y4");
    check_base_class_offset(lv, (E3x6*), 0, "G3x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G3x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G3x6y4.ff");
    test_class_info(&lv, &cd_G3x6y4);
    dp->~G3x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y4(Test_G3x6y4, "G3x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G3x6y4C1Ev();
extern void _ZN6G3x6y4D1Ev();
Name_Map name_map_G3x6y4[] = {
  NSPAIR(_ZN6G3x6y4C1Ev),
  NSPAIR(_ZN6G3x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y4[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y4[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y4[] = {
  {&(_ZTV6G3x6y4[4]),  4,8},
  {&(_tg__ZTV4E3x6__6G3x6y4[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y4[3]),  3,4},
  {&(_ZTV6G3x6y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G3x6y4[];
extern  VTBL_ENTRY _ZTV6G3x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y4[];
Class_Descriptor cd_G3x6y4 = {  "G3x6y4", // class name
  bases_G3x6y4, 6,
  &(vtc_G3x6y4[0]), // expected_vtbl_contents
  &(vtt_G3x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G3x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y5  : virtual E3x6 , F0 {
  int ff;
  ~G3x6y5(); // tgen
  G3x6y5(); // tgen
};
//SIG(1 G3x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G3x6y5 ::~G3x6y5(){ note_dtor("G3x6y5", this);} // tgen
G3x6y5 ::G3x6y5(){ note_ctor("G3x6y5", this);} // tgen

static void Test_G3x6y5()
{
  extern Class_Descriptor cd_G3x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x6y5, buf);
    G3x6y5 *dp, &lv = *(dp=new (buf) G3x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y5)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(40,28), "G3x6y5");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(24,16), "G3x6y5");
    check_base_class_offset(lv, (C3*)(E3x6*), ABISELECT(16,12), "G3x6y5");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(52,36), "G3x6y5");
    check_base_class_offset(lv, (E3x6*), ABISELECT(16,12), "G3x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x6y5.ff");
    test_class_info(&lv, &cd_G3x6y5);
    dp->~G3x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y5(Test_G3x6y5, "G3x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x6y5C1Ev();
extern void _ZN6G3x6y5D1Ev();
Name_Map name_map_G3x6y5[] = {
  NSPAIR(_ZN6G3x6y5C1Ev),
  NSPAIR(_ZN6G3x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y5[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x6y5[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y5[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y5[] = {
  {&(_ZTV6G3x6y5[5]),  5,13},
  {&(_ZTV6G3x6y5[9]),  9,13},
  {&(_ZTV6G3x6y5[12]),  12,13},
  {&(_tg__ZTV4E3x6__6G3x6y5[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x6y5[];
extern  VTBL_ENTRY _ZTV6G3x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y5[];
Class_Descriptor cd_G3x6y5 = {  "G3x6y5", // class name
  bases_G3x6y5, 6,
  &(vtc_G3x6y5[0]), // expected_vtbl_contents
  &(vtt_G3x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y6  : E3x6 , virtual F0 {
  int ff;
  ~G3x6y6(); // tgen
  G3x6y6(); // tgen
};
//SIG(1 G3x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x6y6 ::~G3x6y6(){ note_dtor("G3x6y6", this);} // tgen
G3x6y6 ::G3x6y6(){ note_ctor("G3x6y6", this);} // tgen

static void Test_G3x6y6()
{
  extern Class_Descriptor cd_G3x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G3x6y6, buf);
    G3x6y6 *dp, &lv = *(dp=new (buf) G3x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G3x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y6)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(24,20), "G3x6y6");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(8,4), "G3x6y6");
    check_base_class_offset(lv, (C3*)(E3x6*), 0, "G3x6y6");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(36,28), "G3x6y6");
    check_base_class_offset(lv, (E3x6*), 0, "G3x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G3x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G3x6y6.ff");
    test_class_info(&lv, &cd_G3x6y6);
    dp->~G3x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y6(Test_G3x6y6, "G3x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G3x6y6C1Ev();
extern void _ZN6G3x6y6D1Ev();
Name_Map name_map_G3x6y6[] = {
  NSPAIR(_ZN6G3x6y6C1Ev),
  NSPAIR(_ZN6G3x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y6[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G3x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y6[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y6[] = {
  {&(_ZTV6G3x6y6[5]),  5,9},
  {&(_tg__ZTV4E3x6__6G3x6y6[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y6[3]),  3,4},
  {&(_ZTV6G3x6y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G3x6y6[];
extern  VTBL_ENTRY _ZTV6G3x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y6[];
Class_Descriptor cd_G3x6y6 = {  "G3x6y6", // class name
  bases_G3x6y6, 6,
  &(vtc_G3x6y6[0]), // expected_vtbl_contents
  &(vtt_G3x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G3x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x6y7  : virtual E3x6 , virtual F0 {
  int ff;
  ~G3x6y7(); // tgen
  G3x6y7(); // tgen
};
//SIG(1 G3x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x6y7 ::~G3x6y7(){ note_dtor("G3x6y7", this);} // tgen
G3x6y7 ::G3x6y7(){ note_ctor("G3x6y7", this);} // tgen

static void Test_G3x6y7()
{
  extern Class_Descriptor cd_G3x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G3x6y7, buf);
    G3x6y7 *dp, &lv = *(dp=new (buf) G3x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G3x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x6y7)");
    check_base_class_offset(lv, (A1*)(C3*)(E3x6*), ABISELECT(40,24), "G3x6y7");
    check_base_class_offset(lv, (B0*)(C3*)(E3x6*), ABISELECT(24,12), "G3x6y7");
    check_base_class_offset(lv, (C3*)(E3x6*), ABISELECT(16,8), "G3x6y7");
    check_base_class_offset(lv, (D0*)(E3x6*), ABISELECT(52,32), "G3x6y7");
    check_base_class_offset(lv, (E3x6*), ABISELECT(16,8), "G3x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G3x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x6y7.ff");
    test_class_info(&lv, &cd_G3x6y7);
    dp->~G3x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x6y7(Test_G3x6y7, "G3x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G3x6y7C1Ev();
extern void _ZN6G3x6y7D1Ev();
Name_Map name_map_G3x6y7[] = {
  NSPAIR(_ZN6G3x6y7C1Ev),
  NSPAIR(_ZN6G3x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x6;
extern VTBL_ENTRY _ZTI4E3x6[];
extern  VTBL_ENTRY _ZTV4E3x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x6y7[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x6y7[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G3x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x6y7[];
static  VTBL_ENTRY _tg__ZTV4E3x6__6G3x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C34E3x6__6G3x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C34E3x6__6G3x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x6__6G3x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x6y7[] = {
  {&(_ZTV6G3x6y7[6]),  6,14},
  {&(_ZTV6G3x6y7[10]),  10,14},
  {&(_ZTV6G3x6y7[13]),  13,14},
  {&(_tg__ZTV4E3x6__6G3x6y7[4]),  4,4},
  {&(_tg__ZTV2C34E3x6__6G3x6y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C34E3x6__6G3x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__4E3x6__6G3x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x6y7[];
extern  VTBL_ENTRY _ZTV6G3x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x6y7[];
Class_Descriptor cd_G3x6y7 = {  "G3x6y7", // class name
  bases_G3x6y7, 6,
  &(vtc_G3x6y7[0]), // expected_vtbl_contents
  &(vtt_G3x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G3x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x6y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x6  : C4 , virtual D0 {
  int fd;
  ~E4x6(); // tgen
  E4x6(); // tgen
};
//SIG(-1 E4x6) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E4x6 ::~E4x6(){ note_dtor("E4x6", this);} // tgen
E4x6 ::E4x6(){ note_ctor("E4x6", this);} // tgen

static void Test_E4x6()
{
  extern Class_Descriptor cd_E4x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E4x6, buf);
    E4x6 *dp, &lv = *(dp=new (buf) E4x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E4x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x6)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(12,8), "E4x6");
    check_base_class_offset(lv, (B1*)(C4*), 0, "E4x6");
    check_base_class_offset(lv, (C4*), 0, "E4x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E4x6");
    check_field_offset(lv, fd, ABISELECT(20,16), "E4x6.fd");
    test_class_info(&lv, &cd_E4x6);
    dp->~E4x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x6(Test_E4x6, "E4x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E4x6C1Ev();
extern void _ZN4E4x6D1Ev();
Name_Map name_map_E4x6[] = {
  NSPAIR(_ZN4E4x6C1Ev),
  NSPAIR(_ZN4E4x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E4x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E4x6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E4x6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E4x6[];
static  VTT_ENTRY vtt_E4x6[] = {
  {&(_ZTV4E4x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
Class_Descriptor cd_E4x6 = {  "E4x6", // class name
  bases_E4x6, 4,
  &(vtc_E4x6[0]), // expected_vtbl_contents
  &(vtt_E4x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E4x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E4x6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E4x6),1, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y0  : E4x6 , F1 {
  int ff;
  ~G4x6y0(); // tgen
  G4x6y0(); // tgen
};
//SIG(1 G4x6y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x6y0 ::~G4x6y0(){ note_dtor("G4x6y0", this);} // tgen
G4x6y0 ::G4x6y0(){ note_ctor("G4x6y0", this);} // tgen

static void Test_G4x6y0()
{
  extern Class_Descriptor cd_G4x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x6y0, buf);
    G4x6y0 *dp, &lv = *(dp=new (buf) G4x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y0)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(12,8), "G4x6y0");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), 0, "G4x6y0");
    check_base_class_offset(lv, (C4*)(E4x6*), 0, "G4x6y0");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(40,32), "G4x6y0");
    check_base_class_offset(lv, (E4x6*), 0, "G4x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G4x6y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G4x6y0.ff");
    test_class_info(&lv, &cd_G4x6y0);
    dp->~G4x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y0(Test_G4x6y0, "G4x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x6y0C1Ev();
extern void _ZN6G4x6y0D1Ev();
Name_Map name_map_G4x6y0[] = {
  NSPAIR(_ZN6G4x6y0C1Ev),
  NSPAIR(_ZN6G4x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y0[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G4x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y0[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y0[] = {
  {&(_ZTV6G4x6y0[3]),  3,7},
  {&(_tg__ZTV4E4x6__6G4x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y0[];
extern  VTBL_ENTRY _ZTV6G4x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y0[];
Class_Descriptor cd_G4x6y0 = {  "G4x6y0", // class name
  bases_G4x6y0, 6,
  &(vtc_G4x6y0[0]), // expected_vtbl_contents
  &(vtt_G4x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y0),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y1  : virtual E4x6 , F1 {
  int ff;
  ~G4x6y1(); // tgen
  G4x6y1(); // tgen
};
//SIG(1 G4x6y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x6y1 ::~G4x6y1(){ note_dtor("G4x6y1", this);} // tgen
G4x6y1 ::G4x6y1(){ note_ctor("G4x6y1", this);} // tgen

static void Test_G4x6y1()
{
  extern Class_Descriptor cd_G4x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x6y1, buf);
    G4x6y1 *dp, &lv = *(dp=new (buf) G4x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y1)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(28,20), "G4x6y1");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), ABISELECT(16,12), "G4x6y1");
    check_base_class_offset(lv, (C4*)(E4x6*), ABISELECT(16,12), "G4x6y1");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(40,32), "G4x6y1");
    check_base_class_offset(lv, (E4x6*), ABISELECT(16,12), "G4x6y1");
    check_base_class_offset(lv, (F1*), 0, "G4x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x6y1.ff");
    test_class_info(&lv, &cd_G4x6y1);
    dp->~G4x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y1(Test_G4x6y1, "G4x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x6y1C1Ev();
extern void _ZN6G4x6y1D1Ev();
Name_Map name_map_G4x6y1[] = {
  NSPAIR(_ZN6G4x6y1C1Ev),
  NSPAIR(_ZN6G4x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y1[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y1[] = {
  {&(_ZTV6G4x6y1[4]),  4,10},
  {&(_ZTV6G4x6y1[9]),  9,10},
  {&(_tg__ZTV4E4x6__6G4x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y1[];
extern  VTBL_ENTRY _ZTV6G4x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y1[];
Class_Descriptor cd_G4x6y1 = {  "G4x6y1", // class name
  bases_G4x6y1, 6,
  &(vtc_G4x6y1[0]), // expected_vtbl_contents
  &(vtt_G4x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y1),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y2  : E4x6 , virtual F1 {
  int ff;
  ~G4x6y2(); // tgen
  G4x6y2(); // tgen
};
//SIG(1 G4x6y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x6y2 ::~G4x6y2(){ note_dtor("G4x6y2", this);} // tgen
G4x6y2 ::G4x6y2(){ note_ctor("G4x6y2", this);} // tgen

static void Test_G4x6y2()
{
  extern Class_Descriptor cd_G4x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x6y2, buf);
    G4x6y2 *dp, &lv = *(dp=new (buf) G4x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y2)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(12,8), "G4x6y2");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), 0, "G4x6y2");
    check_base_class_offset(lv, (C4*)(E4x6*), 0, "G4x6y2");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(28,24), "G4x6y2");
    check_base_class_offset(lv, (E4x6*), 0, "G4x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G4x6y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G4x6y2.ff");
    test_class_info(&lv, &cd_G4x6y2);
    dp->~G4x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y2(Test_G4x6y2, "G4x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x6y2C1Ev();
extern void _ZN6G4x6y2D1Ev();
Name_Map name_map_G4x6y2[] = {
  NSPAIR(_ZN6G4x6y2C1Ev),
  NSPAIR(_ZN6G4x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G4x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y2[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y2[] = {
  {&(_ZTV6G4x6y2[4]),  4,9},
  {&(_tg__ZTV4E4x6__6G4x6y2[3]),  3,4},
  {&(_ZTV6G4x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G4x6y2[];
extern  VTBL_ENTRY _ZTV6G4x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y2[];
Class_Descriptor cd_G4x6y2 = {  "G4x6y2", // class name
  bases_G4x6y2, 6,
  &(vtc_G4x6y2[0]), // expected_vtbl_contents
  &(vtt_G4x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y2),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y3  : virtual E4x6 , virtual F1 {
  int ff;
  ~G4x6y3(); // tgen
  G4x6y3(); // tgen
};
//SIG(1 G4x6y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x6y3 ::~G4x6y3(){ note_dtor("G4x6y3", this);} // tgen
G4x6y3 ::G4x6y3(){ note_ctor("G4x6y3", this);} // tgen

static void Test_G4x6y3()
{
  extern Class_Descriptor cd_G4x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x6y3, buf);
    G4x6y3 *dp, &lv = *(dp=new (buf) G4x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y3)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(28,16), "G4x6y3");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), ABISELECT(16,8), "G4x6y3");
    check_base_class_offset(lv, (C4*)(E4x6*), ABISELECT(16,8), "G4x6y3");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(40,28), "G4x6y3");
    check_base_class_offset(lv, (E4x6*), ABISELECT(16,8), "G4x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G4x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x6y3.ff");
    test_class_info(&lv, &cd_G4x6y3);
    dp->~G4x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y3(Test_G4x6y3, "G4x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G4x6y3C1Ev();
extern void _ZN6G4x6y3D1Ev();
Name_Map name_map_G4x6y3[] = {
  NSPAIR(_ZN6G4x6y3C1Ev),
  NSPAIR(_ZN6G4x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G4x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y3[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y3[] = {
  {&(_ZTV6G4x6y3[5]),  5,14},
  {&(_ZTV6G4x6y3[9]),  9,14},
  {&(_ZTV6G4x6y3[13]),  13,14},
  {&(_tg__ZTV4E4x6__6G4x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y3[];
extern  VTBL_ENTRY _ZTV6G4x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y3[];
Class_Descriptor cd_G4x6y3 = {  "G4x6y3", // class name
  bases_G4x6y3, 6,
  &(vtc_G4x6y3[0]), // expected_vtbl_contents
  &(vtt_G4x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G4x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y3),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y4  : E4x6 , F0 {
  int ff;
  ~G4x6y4(); // tgen
  G4x6y4(); // tgen
};
//SIG(1 G4x6y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G4x6y4 ::~G4x6y4(){ note_dtor("G4x6y4", this);} // tgen
G4x6y4 ::G4x6y4(){ note_ctor("G4x6y4", this);} // tgen

static void Test_G4x6y4()
{
  extern Class_Descriptor cd_G4x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x6y4, buf);
    G4x6y4 *dp, &lv = *(dp=new (buf) G4x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y4)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(12,8), "G4x6y4");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), 0, "G4x6y4");
    check_base_class_offset(lv, (C4*)(E4x6*), 0, "G4x6y4");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(32,28), "G4x6y4");
    check_base_class_offset(lv, (E4x6*), 0, "G4x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G4x6y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G4x6y4.ff");
    test_class_info(&lv, &cd_G4x6y4);
    dp->~G4x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y4(Test_G4x6y4, "G4x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G4x6y4C1Ev();
extern void _ZN6G4x6y4D1Ev();
Name_Map name_map_G4x6y4[] = {
  NSPAIR(_ZN6G4x6y4C1Ev),
  NSPAIR(_ZN6G4x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y4[] = {
  {&(_ZTV6G4x6y4[3]),  3,4},
  {&(_tg__ZTV4E4x6__6G4x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y4[];
extern  VTBL_ENTRY _ZTV6G4x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y4[];
Class_Descriptor cd_G4x6y4 = {  "G4x6y4", // class name
  bases_G4x6y4, 6,
  &(vtc_G4x6y4[0]), // expected_vtbl_contents
  &(vtt_G4x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G4x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y4),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y5  : virtual E4x6 , F0 {
  int ff;
  ~G4x6y5(); // tgen
  G4x6y5(); // tgen
};
//SIG(1 G4x6y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G4x6y5 ::~G4x6y5(){ note_dtor("G4x6y5", this);} // tgen
G4x6y5 ::G4x6y5(){ note_ctor("G4x6y5", this);} // tgen

static void Test_G4x6y5()
{
  extern Class_Descriptor cd_G4x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x6y5, buf);
    G4x6y5 *dp, &lv = *(dp=new (buf) G4x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y5)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(28,20), "G4x6y5");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), ABISELECT(16,12), "G4x6y5");
    check_base_class_offset(lv, (C4*)(E4x6*), ABISELECT(16,12), "G4x6y5");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(40,32), "G4x6y5");
    check_base_class_offset(lv, (E4x6*), ABISELECT(16,12), "G4x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x6y5.ff");
    test_class_info(&lv, &cd_G4x6y5);
    dp->~G4x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y5(Test_G4x6y5, "G4x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x6y5C1Ev();
extern void _ZN6G4x6y5D1Ev();
Name_Map name_map_G4x6y5[] = {
  NSPAIR(_ZN6G4x6y5C1Ev),
  NSPAIR(_ZN6G4x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y5[] = {
  {&(_ZTV6G4x6y5[4]),  4,9},
  {&(_ZTV6G4x6y5[8]),  8,9},
  {&(_tg__ZTV4E4x6__6G4x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y5[];
extern  VTBL_ENTRY _ZTV6G4x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y5[];
Class_Descriptor cd_G4x6y5 = {  "G4x6y5", // class name
  bases_G4x6y5, 6,
  &(vtc_G4x6y5[0]), // expected_vtbl_contents
  &(vtt_G4x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y5),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y6  : E4x6 , virtual F0 {
  int ff;
  ~G4x6y6(); // tgen
  G4x6y6(); // tgen
};
//SIG(1 G4x6y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x6y6 ::~G4x6y6(){ note_dtor("G4x6y6", this);} // tgen
G4x6y6 ::G4x6y6(){ note_ctor("G4x6y6", this);} // tgen

static void Test_G4x6y6()
{
  extern Class_Descriptor cd_G4x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G4x6y6, buf);
    G4x6y6 *dp, &lv = *(dp=new (buf) G4x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G4x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y6)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(12,8), "G4x6y6");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), 0, "G4x6y6");
    check_base_class_offset(lv, (C4*)(E4x6*), 0, "G4x6y6");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(28,24), "G4x6y6");
    check_base_class_offset(lv, (E4x6*), 0, "G4x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G4x6y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G4x6y6.ff");
    test_class_info(&lv, &cd_G4x6y6);
    dp->~G4x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y6(Test_G4x6y6, "G4x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G4x6y6C1Ev();
extern void _ZN6G4x6y6D1Ev();
Name_Map name_map_G4x6y6[] = {
  NSPAIR(_ZN6G4x6y6C1Ev),
  NSPAIR(_ZN6G4x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y6[] = {
  {&(_ZTV6G4x6y6[4]),  4,5},
  {&(_tg__ZTV4E4x6__6G4x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y6[];
extern  VTBL_ENTRY _ZTV6G4x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y6[];
Class_Descriptor cd_G4x6y6 = {  "G4x6y6", // class name
  bases_G4x6y6, 6,
  &(vtc_G4x6y6[0]), // expected_vtbl_contents
  &(vtt_G4x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G4x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y6),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x6y7  : virtual E4x6 , virtual F0 {
  int ff;
  ~G4x6y7(); // tgen
  G4x6y7(); // tgen
};
//SIG(1 G4x6y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x6y7 ::~G4x6y7(){ note_dtor("G4x6y7", this);} // tgen
G4x6y7 ::G4x6y7(){ note_ctor("G4x6y7", this);} // tgen

static void Test_G4x6y7()
{
  extern Class_Descriptor cd_G4x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x6y7, buf);
    G4x6y7 *dp, &lv = *(dp=new (buf) G4x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x6y7)");
    check_base_class_offset(lv, (A0*)(C4*)(E4x6*), ABISELECT(28,16), "G4x6y7");
    check_base_class_offset(lv, (B1*)(C4*)(E4x6*), ABISELECT(16,8), "G4x6y7");
    check_base_class_offset(lv, (C4*)(E4x6*), ABISELECT(16,8), "G4x6y7");
    check_base_class_offset(lv, (D0*)(E4x6*), ABISELECT(40,28), "G4x6y7");
    check_base_class_offset(lv, (E4x6*), ABISELECT(16,8), "G4x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G4x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x6y7.ff");
    test_class_info(&lv, &cd_G4x6y7);
    dp->~G4x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x6y7(Test_G4x6y7, "G4x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x6y7C1Ev();
extern void _ZN6G4x6y7D1Ev();
Name_Map name_map_G4x6y7[] = {
  NSPAIR(_ZN6G4x6y7C1Ev),
  NSPAIR(_ZN6G4x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x6;
extern VTBL_ENTRY _ZTI4E4x6[];
extern  VTBL_ENTRY _ZTV4E4x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E4x6__6G4x6y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x6y7[] = {
  {&(_ZTV6G4x6y7[5]),  5,10},
  {&(_ZTV6G4x6y7[9]),  9,10},
  {&(_tg__ZTV4E4x6__6G4x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x6y7[];
extern  VTBL_ENTRY _ZTV6G4x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x6y7[];
Class_Descriptor cd_G4x6y7 = {  "G4x6y7", // class name
  bases_G4x6y7, 6,
  &(vtc_G4x6y7[0]), // expected_vtbl_contents
  &(vtt_G4x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x6y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x6y7),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E5x6  : C5 , virtual D0 {
  int fd;
  ~E5x6(); // tgen
  E5x6(); // tgen
};
//SIG(-1 E5x6) C1{ BC2{ BC3{ v1 Fi} BC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E5x6 ::~E5x6(){ note_dtor("E5x6", this);} // tgen
E5x6 ::E5x6(){ note_ctor("E5x6", this);} // tgen

static void Test_E5x6()
{
  extern Class_Descriptor cd_E5x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E5x6, buf);
    E5x6 *dp, &lv = *(dp=new (buf) E5x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E5x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x6)");
    check_base_class_offset(lv, (A1*)(C5*), 0, "E5x6");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(16,8), "E5x6");
    check_base_class_offset(lv, (C5*), 0, "E5x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E5x6");
    check_field_offset(lv, fd, ABISELECT(32,20), "E5x6.fd");
    test_class_info(&lv, &cd_E5x6);
    dp->~E5x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x6(Test_E5x6, "E5x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E5x6C1Ev();
extern void _ZN4E5x6D1Ev();
Name_Map name_map_E5x6[] = {
  NSPAIR(_ZN4E5x6C1Ev),
  NSPAIR(_ZN4E5x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E5x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E5x6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E5x6[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E5x6[];
static  VTT_ENTRY vtt_E5x6[] = {
  {&(_ZTV4E5x6[3]),  3,7},
};
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
Class_Descriptor cd_E5x6 = {  "E5x6", // class name
  bases_E5x6, 4,
  &(vtc_E5x6[0]), // expected_vtbl_contents
  &(vtt_E5x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E5x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E5x6),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E5x6),1, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y0  : E5x6 , F1 {
  int ff;
  ~G5x6y0(); // tgen
  G5x6y0(); // tgen
};
//SIG(1 G5x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x6y0 ::~G5x6y0(){ note_dtor("G5x6y0", this);} // tgen
G5x6y0 ::G5x6y0(){ note_ctor("G5x6y0", this);} // tgen

static void Test_G5x6y0()
{
  extern Class_Descriptor cd_G5x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x6y0, buf);
    G5x6y0 *dp, &lv = *(dp=new (buf) G5x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y0)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), 0, "G5x6y0");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(16,8), "G5x6y0");
    check_base_class_offset(lv, (C5*)(E5x6*), 0, "G5x6y0");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(56,36), "G5x6y0");
    check_base_class_offset(lv, (E5x6*), 0, "G5x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,24), "G5x6y0");
    check_field_offset(lv, ff, ABISELECT(52,32), "G5x6y0.ff");
    test_class_info(&lv, &cd_G5x6y0);
    dp->~G5x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y0(Test_G5x6y0, "G5x6y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x6y0C1Ev();
extern void _ZN6G5x6y0D1Ev();
Name_Map name_map_G5x6y0[] = {
  NSPAIR(_ZN6G5x6y0C1Ev),
  NSPAIR(_ZN6G5x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y0[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x6y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G5x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y0[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y0[] = {
  {&(_ZTV6G5x6y0[3]),  3,10},
  {&(_tg__ZTV4E5x6__6G5x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y0[];
extern  VTBL_ENTRY _ZTV6G5x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y0[];
Class_Descriptor cd_G5x6y0 = {  "G5x6y0", // class name
  bases_G5x6y0, 6,
  &(vtc_G5x6y0[0]), // expected_vtbl_contents
  &(vtt_G5x6y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y0),2, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y1  : virtual E5x6 , F1 {
  int ff;
  ~G5x6y1(); // tgen
  G5x6y1(); // tgen
};
//SIG(1 G5x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x6y1 ::~G5x6y1(){ note_dtor("G5x6y1", this);} // tgen
G5x6y1 ::G5x6y1(){ note_ctor("G5x6y1", this);} // tgen

static void Test_G5x6y1()
{
  extern Class_Descriptor cd_G5x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x6y1, buf);
    G5x6y1 *dp, &lv = *(dp=new (buf) G5x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y1)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), ABISELECT(16,12), "G5x6y1");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(32,20), "G5x6y1");
    check_base_class_offset(lv, (C5*)(E5x6*), ABISELECT(16,12), "G5x6y1");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(52,36), "G5x6y1");
    check_base_class_offset(lv, (E5x6*), ABISELECT(16,12), "G5x6y1");
    check_base_class_offset(lv, (F1*), 0, "G5x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x6y1.ff");
    test_class_info(&lv, &cd_G5x6y1);
    dp->~G5x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y1(Test_G5x6y1, "G5x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x6y1C1Ev();
extern void _ZN6G5x6y1D1Ev();
Name_Map name_map_G5x6y1[] = {
  NSPAIR(_ZN6G5x6y1C1Ev),
  NSPAIR(_ZN6G5x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y1[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y1[] = {
  {&(_ZTV6G5x6y1[4]),  4,13},
  {&(_ZTV6G5x6y1[9]),  9,13},
  {&(_ZTV6G5x6y1[12]),  12,13},
  {&(_tg__ZTV4E5x6__6G5x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y1[];
extern  VTBL_ENTRY _ZTV6G5x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y1[];
Class_Descriptor cd_G5x6y1 = {  "G5x6y1", // class name
  bases_G5x6y1, 6,
  &(vtc_G5x6y1[0]), // expected_vtbl_contents
  &(vtt_G5x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y1),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y1),4, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y2  : E5x6 , virtual F1 {
  int ff;
  ~G5x6y2(); // tgen
  G5x6y2(); // tgen
};
//SIG(1 G5x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x6y2 ::~G5x6y2(){ note_dtor("G5x6y2", this);} // tgen
G5x6y2 ::G5x6y2(){ note_ctor("G5x6y2", this);} // tgen

static void Test_G5x6y2()
{
  extern Class_Descriptor cd_G5x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x6y2, buf);
    G5x6y2 *dp, &lv = *(dp=new (buf) G5x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y2)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), 0, "G5x6y2");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(16,8), "G5x6y2");
    check_base_class_offset(lv, (C5*)(E5x6*), 0, "G5x6y2");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(40,28), "G5x6y2");
    check_base_class_offset(lv, (E5x6*), 0, "G5x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G5x6y2");
    check_field_offset(lv, ff, ABISELECT(36,24), "G5x6y2.ff");
    test_class_info(&lv, &cd_G5x6y2);
    dp->~G5x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y2(Test_G5x6y2, "G5x6y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x6y2C1Ev();
extern void _ZN6G5x6y2D1Ev();
Name_Map name_map_G5x6y2[] = {
  NSPAIR(_ZN6G5x6y2C1Ev),
  NSPAIR(_ZN6G5x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x6y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G5x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y2[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y2[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y2[] = {
  {&(_ZTV6G5x6y2[4]),  4,12},
  {&(_tg__ZTV4E5x6__6G5x6y2[3]),  3,4},
  {&(_ZTV6G5x6y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G5x6y2[];
extern  VTBL_ENTRY _ZTV6G5x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y2[];
Class_Descriptor cd_G5x6y2 = {  "G5x6y2", // class name
  bases_G5x6y2, 6,
  &(vtc_G5x6y2[0]), // expected_vtbl_contents
  &(vtt_G5x6y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y2),3, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y3  : virtual E5x6 , virtual F1 {
  int ff;
  ~G5x6y3(); // tgen
  G5x6y3(); // tgen
};
//SIG(1 G5x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x6y3 ::~G5x6y3(){ note_dtor("G5x6y3", this);} // tgen
G5x6y3 ::G5x6y3(){ note_ctor("G5x6y3", this);} // tgen

static void Test_G5x6y3()
{
  extern Class_Descriptor cd_G5x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x6y3, buf);
    G5x6y3 *dp, &lv = *(dp=new (buf) G5x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y3)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), ABISELECT(16,8), "G5x6y3");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(32,16), "G5x6y3");
    check_base_class_offset(lv, (C5*)(E5x6*), ABISELECT(16,8), "G5x6y3");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(52,32), "G5x6y3");
    check_base_class_offset(lv, (E5x6*), ABISELECT(16,8), "G5x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x6y3.ff");
    test_class_info(&lv, &cd_G5x6y3);
    dp->~G5x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y3(Test_G5x6y3, "G5x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x6y3C1Ev();
extern void _ZN6G5x6y3D1Ev();
Name_Map name_map_G5x6y3[] = {
  NSPAIR(_ZN6G5x6y3C1Ev),
  NSPAIR(_ZN6G5x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G5x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G5x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y3[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y3[] = {
  {&(_ZTV6G5x6y3[5]),  5,17},
  {&(_ZTV6G5x6y3[9]),  9,17},
  {&(_ZTV6G5x6y3[12]),  12,17},
  {&(_ZTV6G5x6y3[16]),  16,17},
  {&(_tg__ZTV4E5x6__6G5x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y3[];
extern  VTBL_ENTRY _ZTV6G5x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y3[];
Class_Descriptor cd_G5x6y3 = {  "G5x6y3", // class name
  bases_G5x6y3, 6,
  &(vtc_G5x6y3[0]), // expected_vtbl_contents
  &(vtt_G5x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y3),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y3),5, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y4  : E5x6 , F0 {
  int ff;
  ~G5x6y4(); // tgen
  G5x6y4(); // tgen
};
//SIG(1 G5x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G5x6y4 ::~G5x6y4(){ note_dtor("G5x6y4", this);} // tgen
G5x6y4 ::G5x6y4(){ note_ctor("G5x6y4", this);} // tgen

static void Test_G5x6y4()
{
  extern Class_Descriptor cd_G5x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x6y4, buf);
    G5x6y4 *dp, &lv = *(dp=new (buf) G5x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y4)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), 0, "G5x6y4");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(16,8), "G5x6y4");
    check_base_class_offset(lv, (C5*)(E5x6*), 0, "G5x6y4");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(44,32), "G5x6y4");
    check_base_class_offset(lv, (E5x6*), 0, "G5x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(36,24), "G5x6y4");
    check_field_offset(lv, ff, ABISELECT(40,28), "G5x6y4.ff");
    test_class_info(&lv, &cd_G5x6y4);
    dp->~G5x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y4(Test_G5x6y4, "G5x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G5x6y4C1Ev();
extern void _ZN6G5x6y4D1Ev();
Name_Map name_map_G5x6y4[] = {
  NSPAIR(_ZN6G5x6y4C1Ev),
  NSPAIR(_ZN6G5x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x6y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y4[] = {
  {&(_ZTV6G5x6y4[3]),  3,7},
  {&(_tg__ZTV4E5x6__6G5x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y4[];
extern  VTBL_ENTRY _ZTV6G5x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y4[];
Class_Descriptor cd_G5x6y4 = {  "G5x6y4", // class name
  bases_G5x6y4, 6,
  &(vtc_G5x6y4[0]), // expected_vtbl_contents
  &(vtt_G5x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G5x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y4),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y5  : virtual E5x6 , F0 {
  int ff;
  ~G5x6y5(); // tgen
  G5x6y5(); // tgen
};
//SIG(1 G5x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G5x6y5 ::~G5x6y5(){ note_dtor("G5x6y5", this);} // tgen
G5x6y5 ::G5x6y5(){ note_ctor("G5x6y5", this);} // tgen

static void Test_G5x6y5()
{
  extern Class_Descriptor cd_G5x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x6y5, buf);
    G5x6y5 *dp, &lv = *(dp=new (buf) G5x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y5)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), ABISELECT(16,12), "G5x6y5");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(32,20), "G5x6y5");
    check_base_class_offset(lv, (C5*)(E5x6*), ABISELECT(16,12), "G5x6y5");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(52,36), "G5x6y5");
    check_base_class_offset(lv, (E5x6*), ABISELECT(16,12), "G5x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x6y5.ff");
    test_class_info(&lv, &cd_G5x6y5);
    dp->~G5x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y5(Test_G5x6y5, "G5x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x6y5C1Ev();
extern void _ZN6G5x6y5D1Ev();
Name_Map name_map_G5x6y5[] = {
  NSPAIR(_ZN6G5x6y5C1Ev),
  NSPAIR(_ZN6G5x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y5[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y5[] = {
  {&(_ZTV6G5x6y5[4]),  4,12},
  {&(_ZTV6G5x6y5[8]),  8,12},
  {&(_ZTV6G5x6y5[11]),  11,12},
  {&(_tg__ZTV4E5x6__6G5x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y5[];
extern  VTBL_ENTRY _ZTV6G5x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y5[];
Class_Descriptor cd_G5x6y5 = {  "G5x6y5", // class name
  bases_G5x6y5, 6,
  &(vtc_G5x6y5[0]), // expected_vtbl_contents
  &(vtt_G5x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y5),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y5),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y6  : E5x6 , virtual F0 {
  int ff;
  ~G5x6y6(); // tgen
  G5x6y6(); // tgen
};
//SIG(1 G5x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x6y6 ::~G5x6y6(){ note_dtor("G5x6y6", this);} // tgen
G5x6y6 ::G5x6y6(){ note_ctor("G5x6y6", this);} // tgen

static void Test_G5x6y6()
{
  extern Class_Descriptor cd_G5x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G5x6y6, buf);
    G5x6y6 *dp, &lv = *(dp=new (buf) G5x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G5x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y6)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), 0, "G5x6y6");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(16,8), "G5x6y6");
    check_base_class_offset(lv, (C5*)(E5x6*), 0, "G5x6y6");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(40,28), "G5x6y6");
    check_base_class_offset(lv, (E5x6*), 0, "G5x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G5x6y6");
    check_field_offset(lv, ff, ABISELECT(36,24), "G5x6y6.ff");
    test_class_info(&lv, &cd_G5x6y6);
    dp->~G5x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y6(Test_G5x6y6, "G5x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G5x6y6C1Ev();
extern void _ZN6G5x6y6D1Ev();
Name_Map name_map_G5x6y6[] = {
  NSPAIR(_ZN6G5x6y6C1Ev),
  NSPAIR(_ZN6G5x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x6y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y6[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y6[] = {
  {&(_ZTV6G5x6y6[4]),  4,8},
  {&(_tg__ZTV4E5x6__6G5x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y6[];
extern  VTBL_ENTRY _ZTV6G5x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y6[];
Class_Descriptor cd_G5x6y6 = {  "G5x6y6", // class name
  bases_G5x6y6, 6,
  &(vtc_G5x6y6[0]), // expected_vtbl_contents
  &(vtt_G5x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G5x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y6),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x6y7  : virtual E5x6 , virtual F0 {
  int ff;
  ~G5x6y7(); // tgen
  G5x6y7(); // tgen
};
//SIG(1 G5x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x6y7 ::~G5x6y7(){ note_dtor("G5x6y7", this);} // tgen
G5x6y7 ::G5x6y7(){ note_ctor("G5x6y7", this);} // tgen

static void Test_G5x6y7()
{
  extern Class_Descriptor cd_G5x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x6y7, buf);
    G5x6y7 *dp, &lv = *(dp=new (buf) G5x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x6y7)");
    check_base_class_offset(lv, (A1*)(C5*)(E5x6*), ABISELECT(16,8), "G5x6y7");
    check_base_class_offset(lv, (B1*)(C5*)(E5x6*), ABISELECT(32,16), "G5x6y7");
    check_base_class_offset(lv, (C5*)(E5x6*), ABISELECT(16,8), "G5x6y7");
    check_base_class_offset(lv, (D0*)(E5x6*), ABISELECT(52,32), "G5x6y7");
    check_base_class_offset(lv, (E5x6*), ABISELECT(16,8), "G5x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G5x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x6y7.ff");
    test_class_info(&lv, &cd_G5x6y7);
    dp->~G5x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x6y7(Test_G5x6y7, "G5x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x6y7C1Ev();
extern void _ZN6G5x6y7D1Ev();
Name_Map name_map_G5x6y7[] = {
  NSPAIR(_ZN6G5x6y7C1Ev),
  NSPAIR(_ZN6G5x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x6;
extern VTBL_ENTRY _ZTI4E5x6[];
extern  VTBL_ENTRY _ZTV4E5x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x6y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G5x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E5x6__6G5x6y7[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G5x6y7[] = {
  {&(_ZTV6G5x6y7[5]),  5,13},
  {&(_ZTV6G5x6y7[9]),  9,13},
  {&(_ZTV6G5x6y7[12]),  12,13},
  {&(_tg__ZTV4E5x6__6G5x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G5x6y7[];
extern  VTBL_ENTRY _ZTV6G5x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x6y7[];
Class_Descriptor cd_G5x6y7 = {  "G5x6y7", // class name
  bases_G5x6y7, 6,
  &(vtc_G5x6y7[0]), // expected_vtbl_contents
  &(vtt_G5x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x6y7),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x6y7),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E6x6  : C6 , virtual D0 {
  int fd;
  ~E6x6(); // tgen
  E6x6(); // tgen
};
//SIG(-1 E6x6) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E6x6 ::~E6x6(){ note_dtor("E6x6", this);} // tgen
E6x6 ::E6x6(){ note_ctor("E6x6", this);} // tgen

static void Test_E6x6()
{
  extern Class_Descriptor cd_E6x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E6x6, buf);
    E6x6 *dp, &lv = *(dp=new (buf) E6x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E6x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x6)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(20,16), "E6x6");
    check_base_class_offset(lv, (B1*)(C6*), 0, "E6x6");
    check_base_class_offset(lv, (C6*), 0, "E6x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E6x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E6x6.fd");
    test_class_info(&lv, &cd_E6x6);
    dp->~E6x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x6(Test_E6x6, "E6x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E6x6C1Ev();
extern void _ZN4E6x6D1Ev();
Name_Map name_map_E6x6[] = {
  NSPAIR(_ZN4E6x6C1Ev),
  NSPAIR(_ZN4E6x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E6x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E6x6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E6x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E6x6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x6[] = {
  {&(_ZTV4E6x6[4]),  4,5},
  {&(_tg__ZTV2C6__4E6x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
Class_Descriptor cd_E6x6 = {  "E6x6", // class name
  bases_E6x6, 4,
  &(vtc_E6x6[0]), // expected_vtbl_contents
  &(vtt_E6x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E6x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E6x6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E6x6),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y0  : E6x6 , F1 {
  int ff;
  ~G6x6y0(); // tgen
  G6x6y0(); // tgen
};
//SIG(1 G6x6y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x6y0 ::~G6x6y0(){ note_dtor("G6x6y0", this);} // tgen
G6x6y0 ::G6x6y0(){ note_ctor("G6x6y0", this);} // tgen

static void Test_G6x6y0()
{
  extern Class_Descriptor cd_G6x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x6y0, buf);
    G6x6y0 *dp, &lv = *(dp=new (buf) G6x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y0)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(40,28), "G6x6y0");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), 0, "G6x6y0");
    check_base_class_offset(lv, (C6*)(E6x6*), 0, "G6x6y0");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(44,32), "G6x6y0");
    check_base_class_offset(lv, (E6x6*), 0, "G6x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G6x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G6x6y0.ff");
    test_class_info(&lv, &cd_G6x6y0);
    dp->~G6x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y0(Test_G6x6y0, "G6x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x6y0C1Ev();
extern void _ZN6G6x6y0D1Ev();
Name_Map name_map_G6x6y0[] = {
  NSPAIR(_ZN6G6x6y0C1Ev),
  NSPAIR(_ZN6G6x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y0[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G6x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y0[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y0[] = {
  {&(_ZTV6G6x6y0[4]),  4,8},
  {&(_tg__ZTV4E6x6__6G6x6y0[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y0[];
extern  VTBL_ENTRY _ZTV6G6x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y0[];
Class_Descriptor cd_G6x6y0 = {  "G6x6y0", // class name
  bases_G6x6y0, 6,
  &(vtc_G6x6y0[0]), // expected_vtbl_contents
  &(vtt_G6x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y1  : virtual E6x6 , F1 {
  int ff;
  ~G6x6y1(); // tgen
  G6x6y1(); // tgen
};
//SIG(1 G6x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x6y1 ::~G6x6y1(){ note_dtor("G6x6y1", this);} // tgen
G6x6y1 ::G6x6y1(){ note_ctor("G6x6y1", this);} // tgen

static void Test_G6x6y1()
{
  extern Class_Descriptor cd_G6x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x6y1, buf);
    G6x6y1 *dp, &lv = *(dp=new (buf) G6x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y1)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(36,28), "G6x6y1");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), ABISELECT(16,12), "G6x6y1");
    check_base_class_offset(lv, (C6*)(E6x6*), ABISELECT(16,12), "G6x6y1");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(40,32), "G6x6y1");
    check_base_class_offset(lv, (E6x6*), ABISELECT(16,12), "G6x6y1");
    check_base_class_offset(lv, (F1*), 0, "G6x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x6y1.ff");
    test_class_info(&lv, &cd_G6x6y1);
    dp->~G6x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y1(Test_G6x6y1, "G6x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x6y1C1Ev();
extern void _ZN6G6x6y1D1Ev();
Name_Map name_map_G6x6y1[] = {
  NSPAIR(_ZN6G6x6y1C1Ev),
  NSPAIR(_ZN6G6x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y1[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y1[] = {
  {&(_ZTV6G6x6y1[5]),  5,12},
  {&(_ZTV6G6x6y1[11]),  11,12},
  {&(_tg__ZTV4E6x6__6G6x6y1[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y1[];
extern  VTBL_ENTRY _ZTV6G6x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y1[];
Class_Descriptor cd_G6x6y1 = {  "G6x6y1", // class name
  bases_G6x6y1, 6,
  &(vtc_G6x6y1[0]), // expected_vtbl_contents
  &(vtt_G6x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y2  : E6x6 , virtual F1 {
  int ff;
  ~G6x6y2(); // tgen
  G6x6y2(); // tgen
};
//SIG(1 G6x6y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x6y2 ::~G6x6y2(){ note_dtor("G6x6y2", this);} // tgen
G6x6y2 ::G6x6y2(){ note_ctor("G6x6y2", this);} // tgen

static void Test_G6x6y2()
{
  extern Class_Descriptor cd_G6x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x6y2, buf);
    G6x6y2 *dp, &lv = *(dp=new (buf) G6x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y2)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(24,20), "G6x6y2");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), 0, "G6x6y2");
    check_base_class_offset(lv, (C6*)(E6x6*), 0, "G6x6y2");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(28,24), "G6x6y2");
    check_base_class_offset(lv, (E6x6*), 0, "G6x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G6x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G6x6y2.ff");
    test_class_info(&lv, &cd_G6x6y2);
    dp->~G6x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y2(Test_G6x6y2, "G6x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x6y2C1Ev();
extern void _ZN6G6x6y2D1Ev();
Name_Map name_map_G6x6y2[] = {
  NSPAIR(_ZN6G6x6y2C1Ev),
  NSPAIR(_ZN6G6x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G6x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y2[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y2[] = {
  {&(_ZTV6G6x6y2[5]),  5,10},
  {&(_tg__ZTV4E6x6__6G6x6y2[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y2[3]),  3,4},
  {&(_ZTV6G6x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G6x6y2[];
extern  VTBL_ENTRY _ZTV6G6x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y2[];
Class_Descriptor cd_G6x6y2 = {  "G6x6y2", // class name
  bases_G6x6y2, 6,
  &(vtc_G6x6y2[0]), // expected_vtbl_contents
  &(vtt_G6x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y3  : virtual E6x6 , virtual F1 {
  int ff;
  ~G6x6y3(); // tgen
  G6x6y3(); // tgen
};
//SIG(1 G6x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x6y3 ::~G6x6y3(){ note_dtor("G6x6y3", this);} // tgen
G6x6y3 ::G6x6y3(){ note_ctor("G6x6y3", this);} // tgen

static void Test_G6x6y3()
{
  extern Class_Descriptor cd_G6x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x6y3, buf);
    G6x6y3 *dp, &lv = *(dp=new (buf) G6x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y3)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(36,24), "G6x6y3");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), ABISELECT(16,8), "G6x6y3");
    check_base_class_offset(lv, (C6*)(E6x6*), ABISELECT(16,8), "G6x6y3");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(40,28), "G6x6y3");
    check_base_class_offset(lv, (E6x6*), ABISELECT(16,8), "G6x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G6x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x6y3.ff");
    test_class_info(&lv, &cd_G6x6y3);
    dp->~G6x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y3(Test_G6x6y3, "G6x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G6x6y3C1Ev();
extern void _ZN6G6x6y3D1Ev();
Name_Map name_map_G6x6y3[] = {
  NSPAIR(_ZN6G6x6y3C1Ev),
  NSPAIR(_ZN6G6x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G6x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y3[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y3[] = {
  {&(_ZTV6G6x6y3[6]),  6,16},
  {&(_ZTV6G6x6y3[11]),  11,16},
  {&(_ZTV6G6x6y3[15]),  15,16},
  {&(_tg__ZTV4E6x6__6G6x6y3[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y3[];
extern  VTBL_ENTRY _ZTV6G6x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y3[];
Class_Descriptor cd_G6x6y3 = {  "G6x6y3", // class name
  bases_G6x6y3, 6,
  &(vtc_G6x6y3[0]), // expected_vtbl_contents
  &(vtt_G6x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G6x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y4  : E6x6 , F0 {
  int ff;
  ~G6x6y4(); // tgen
  G6x6y4(); // tgen
};
//SIG(1 G6x6y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G6x6y4 ::~G6x6y4(){ note_dtor("G6x6y4", this);} // tgen
G6x6y4 ::G6x6y4(){ note_ctor("G6x6y4", this);} // tgen

static void Test_G6x6y4()
{
  extern Class_Descriptor cd_G6x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x6y4, buf);
    G6x6y4 *dp, &lv = *(dp=new (buf) G6x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y4)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(28,24), "G6x6y4");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), 0, "G6x6y4");
    check_base_class_offset(lv, (C6*)(E6x6*), 0, "G6x6y4");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(32,28), "G6x6y4");
    check_base_class_offset(lv, (E6x6*), 0, "G6x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G6x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G6x6y4.ff");
    test_class_info(&lv, &cd_G6x6y4);
    dp->~G6x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y4(Test_G6x6y4, "G6x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G6x6y4C1Ev();
extern void _ZN6G6x6y4D1Ev();
Name_Map name_map_G6x6y4[] = {
  NSPAIR(_ZN6G6x6y4C1Ev),
  NSPAIR(_ZN6G6x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y4[] = {
  {&(_ZTV6G6x6y4[4]),  4,5},
  {&(_tg__ZTV4E6x6__6G6x6y4[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y4[];
extern  VTBL_ENTRY _ZTV6G6x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y4[];
Class_Descriptor cd_G6x6y4 = {  "G6x6y4", // class name
  bases_G6x6y4, 6,
  &(vtc_G6x6y4[0]), // expected_vtbl_contents
  &(vtt_G6x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G6x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y5  : virtual E6x6 , F0 {
  int ff;
  ~G6x6y5(); // tgen
  G6x6y5(); // tgen
};
//SIG(1 G6x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G6x6y5 ::~G6x6y5(){ note_dtor("G6x6y5", this);} // tgen
G6x6y5 ::G6x6y5(){ note_ctor("G6x6y5", this);} // tgen

static void Test_G6x6y5()
{
  extern Class_Descriptor cd_G6x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x6y5, buf);
    G6x6y5 *dp, &lv = *(dp=new (buf) G6x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y5)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(36,28), "G6x6y5");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), ABISELECT(16,12), "G6x6y5");
    check_base_class_offset(lv, (C6*)(E6x6*), ABISELECT(16,12), "G6x6y5");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(40,32), "G6x6y5");
    check_base_class_offset(lv, (E6x6*), ABISELECT(16,12), "G6x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x6y5.ff");
    test_class_info(&lv, &cd_G6x6y5);
    dp->~G6x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y5(Test_G6x6y5, "G6x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x6y5C1Ev();
extern void _ZN6G6x6y5D1Ev();
Name_Map name_map_G6x6y5[] = {
  NSPAIR(_ZN6G6x6y5C1Ev),
  NSPAIR(_ZN6G6x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y5[] = {
  {&(_ZTV6G6x6y5[5]),  5,11},
  {&(_ZTV6G6x6y5[10]),  10,11},
  {&(_tg__ZTV4E6x6__6G6x6y5[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y5[];
extern  VTBL_ENTRY _ZTV6G6x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y5[];
Class_Descriptor cd_G6x6y5 = {  "G6x6y5", // class name
  bases_G6x6y5, 6,
  &(vtc_G6x6y5[0]), // expected_vtbl_contents
  &(vtt_G6x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y6  : E6x6 , virtual F0 {
  int ff;
  ~G6x6y6(); // tgen
  G6x6y6(); // tgen
};
//SIG(1 G6x6y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x6y6 ::~G6x6y6(){ note_dtor("G6x6y6", this);} // tgen
G6x6y6 ::G6x6y6(){ note_ctor("G6x6y6", this);} // tgen

static void Test_G6x6y6()
{
  extern Class_Descriptor cd_G6x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G6x6y6, buf);
    G6x6y6 *dp, &lv = *(dp=new (buf) G6x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G6x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y6)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(24,20), "G6x6y6");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), 0, "G6x6y6");
    check_base_class_offset(lv, (C6*)(E6x6*), 0, "G6x6y6");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(28,24), "G6x6y6");
    check_base_class_offset(lv, (E6x6*), 0, "G6x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G6x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G6x6y6.ff");
    test_class_info(&lv, &cd_G6x6y6);
    dp->~G6x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y6(Test_G6x6y6, "G6x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G6x6y6C1Ev();
extern void _ZN6G6x6y6D1Ev();
Name_Map name_map_G6x6y6[] = {
  NSPAIR(_ZN6G6x6y6C1Ev),
  NSPAIR(_ZN6G6x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y6[] = {
  {&(_ZTV6G6x6y6[5]),  5,6},
  {&(_tg__ZTV4E6x6__6G6x6y6[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y6[];
extern  VTBL_ENTRY _ZTV6G6x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y6[];
Class_Descriptor cd_G6x6y6 = {  "G6x6y6", // class name
  bases_G6x6y6, 6,
  &(vtc_G6x6y6[0]), // expected_vtbl_contents
  &(vtt_G6x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G6x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x6y7  : virtual E6x6 , virtual F0 {
  int ff;
  ~G6x6y7(); // tgen
  G6x6y7(); // tgen
};
//SIG(1 G6x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x6y7 ::~G6x6y7(){ note_dtor("G6x6y7", this);} // tgen
G6x6y7 ::G6x6y7(){ note_ctor("G6x6y7", this);} // tgen

static void Test_G6x6y7()
{
  extern Class_Descriptor cd_G6x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x6y7, buf);
    G6x6y7 *dp, &lv = *(dp=new (buf) G6x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x6y7)");
    check_base_class_offset(lv, (A0*)(C6*)(E6x6*), ABISELECT(36,24), "G6x6y7");
    check_base_class_offset(lv, (B1*)(C6*)(E6x6*), ABISELECT(16,8), "G6x6y7");
    check_base_class_offset(lv, (C6*)(E6x6*), ABISELECT(16,8), "G6x6y7");
    check_base_class_offset(lv, (D0*)(E6x6*), ABISELECT(40,28), "G6x6y7");
    check_base_class_offset(lv, (E6x6*), ABISELECT(16,8), "G6x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G6x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x6y7.ff");
    test_class_info(&lv, &cd_G6x6y7);
    dp->~G6x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x6y7(Test_G6x6y7, "G6x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x6y7C1Ev();
extern void _ZN6G6x6y7D1Ev();
Name_Map name_map_G6x6y7[] = {
  NSPAIR(_ZN6G6x6y7C1Ev),
  NSPAIR(_ZN6G6x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x6;
extern VTBL_ENTRY _ZTI4E6x6[];
extern  VTBL_ENTRY _ZTV4E6x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E6x6__6G6x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C64E6x6__6G6x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x6y7[] = {
  {&(_ZTV6G6x6y7[6]),  6,12},
  {&(_ZTV6G6x6y7[11]),  11,12},
  {&(_tg__ZTV4E6x6__6G6x6y7[4]),  4,5},
  {&(_tg__ZTV2C64E6x6__6G6x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x6y7[];
extern  VTBL_ENTRY _ZTV6G6x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x6y7[];
Class_Descriptor cd_G6x6y7 = {  "G6x6y7", // class name
  bases_G6x6y7, 6,
  &(vtc_G6x6y7[0]), // expected_vtbl_contents
  &(vtt_G6x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x6y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x6y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E7x6  : C7 , virtual D0 {
  int fd;
  ~E7x6(); // tgen
  E7x6(); // tgen
};
//SIG(-1 E7x6) C1{ BC2{ VBC3{ v1 Fi} BC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E7x6 ::~E7x6(){ note_dtor("E7x6", this);} // tgen
E7x6 ::E7x6(){ note_ctor("E7x6", this);} // tgen

static void Test_E7x6()
{
  extern Class_Descriptor cd_E7x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E7x6, buf);
    E7x6 *dp, &lv = *(dp=new (buf) E7x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E7x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x6)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(24,16), "E7x6");
    check_base_class_offset(lv, (B1*)(C7*), 0, "E7x6");
    check_base_class_offset(lv, (C7*), 0, "E7x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E7x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E7x6.fd");
    test_class_info(&lv, &cd_E7x6);
    dp->~E7x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x6(Test_E7x6, "E7x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E7x6C1Ev();
extern void _ZN4E7x6D1Ev();
Name_Map name_map_E7x6[] = {
  NSPAIR(_ZN4E7x6C1Ev),
  NSPAIR(_ZN4E7x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E7x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E7x6[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E7x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E7x6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__4E7x6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x6[] = {
  {&(_ZTV4E7x6[4]),  4,9},
  {&(_tg__ZTV2C7__4E7x6[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__4E7x6[3]),  3,4},
  {&(_ZTV4E7x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
Class_Descriptor cd_E7x6 = {  "E7x6", // class name
  bases_E7x6, 4,
  &(vtc_E7x6[0]), // expected_vtbl_contents
  &(vtt_E7x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E7x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E7x6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E7x6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y0  : E7x6 , F1 {
  int ff;
  ~G7x6y0(); // tgen
  G7x6y0(); // tgen
};
//SIG(1 G7x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x6y0 ::~G7x6y0(){ note_dtor("G7x6y0", this);} // tgen
G7x6y0 ::G7x6y0(){ note_ctor("G7x6y0", this);} // tgen

static void Test_G7x6y0()
{
  extern Class_Descriptor cd_G7x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x6y0, buf);
    G7x6y0 *dp, &lv = *(dp=new (buf) G7x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y0)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(40,28), "G7x6y0");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), 0, "G7x6y0");
    check_base_class_offset(lv, (C7*)(E7x6*), 0, "G7x6y0");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(52,36), "G7x6y0");
    check_base_class_offset(lv, (E7x6*), 0, "G7x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G7x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G7x6y0.ff");
    test_class_info(&lv, &cd_G7x6y0);
    dp->~G7x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y0(Test_G7x6y0, "G7x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x6y0C1Ev();
extern void _ZN6G7x6y0D1Ev();
Name_Map name_map_G7x6y0[] = {
  NSPAIR(_ZN6G7x6y0C1Ev),
  NSPAIR(_ZN6G7x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y0[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G7x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y0[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y0[] = {
  {&(_ZTV6G7x6y0[4]),  4,12},
  {&(_tg__ZTV4E7x6__6G7x6y0[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y0[3]),  3,4},
  {&(_ZTV6G7x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G7x6y0[];
extern  VTBL_ENTRY _ZTV6G7x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y0[];
Class_Descriptor cd_G7x6y0 = {  "G7x6y0", // class name
  bases_G7x6y0, 6,
  &(vtc_G7x6y0[0]), // expected_vtbl_contents
  &(vtt_G7x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y1  : virtual E7x6 , F1 {
  int ff;
  ~G7x6y1(); // tgen
  G7x6y1(); // tgen
};
//SIG(1 G7x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x6y1 ::~G7x6y1(){ note_dtor("G7x6y1", this);} // tgen
G7x6y1 ::G7x6y1(){ note_ctor("G7x6y1", this);} // tgen

static void Test_G7x6y1()
{
  extern Class_Descriptor cd_G7x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x6y1, buf);
    G7x6y1 *dp, &lv = *(dp=new (buf) G7x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y1)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(40,28), "G7x6y1");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), ABISELECT(16,12), "G7x6y1");
    check_base_class_offset(lv, (C7*)(E7x6*), ABISELECT(16,12), "G7x6y1");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(52,36), "G7x6y1");
    check_base_class_offset(lv, (E7x6*), ABISELECT(16,12), "G7x6y1");
    check_base_class_offset(lv, (F1*), 0, "G7x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x6y1.ff");
    test_class_info(&lv, &cd_G7x6y1);
    dp->~G7x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y1(Test_G7x6y1, "G7x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x6y1C1Ev();
extern void _ZN6G7x6y1D1Ev();
Name_Map name_map_G7x6y1[] = {
  NSPAIR(_ZN6G7x6y1C1Ev),
  NSPAIR(_ZN6G7x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y1[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y1[] = {
  {&(_ZTV6G7x6y1[5]),  5,16},
  {&(_ZTV6G7x6y1[11]),  11,16},
  {&(_ZTV6G7x6y1[15]),  15,16},
  {&(_tg__ZTV4E7x6__6G7x6y1[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x6y1[];
extern  VTBL_ENTRY _ZTV6G7x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y1[];
Class_Descriptor cd_G7x6y1 = {  "G7x6y1", // class name
  bases_G7x6y1, 6,
  &(vtc_G7x6y1[0]), // expected_vtbl_contents
  &(vtt_G7x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y2  : E7x6 , virtual F1 {
  int ff;
  ~G7x6y2(); // tgen
  G7x6y2(); // tgen
};
//SIG(1 G7x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x6y2 ::~G7x6y2(){ note_dtor("G7x6y2", this);} // tgen
G7x6y2 ::G7x6y2(){ note_ctor("G7x6y2", this);} // tgen

static void Test_G7x6y2()
{
  extern Class_Descriptor cd_G7x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x6y2, buf);
    G7x6y2 *dp, &lv = *(dp=new (buf) G7x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y2)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(24,20), "G7x6y2");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), 0, "G7x6y2");
    check_base_class_offset(lv, (C7*)(E7x6*), 0, "G7x6y2");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(36,28), "G7x6y2");
    check_base_class_offset(lv, (E7x6*), 0, "G7x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G7x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G7x6y2.ff");
    test_class_info(&lv, &cd_G7x6y2);
    dp->~G7x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y2(Test_G7x6y2, "G7x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x6y2C1Ev();
extern void _ZN6G7x6y2D1Ev();
Name_Map name_map_G7x6y2[] = {
  NSPAIR(_ZN6G7x6y2C1Ev),
  NSPAIR(_ZN6G7x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y2[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G7x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G7x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y2[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y2[] = {
  {&(_ZTV6G7x6y2[5]),  5,14},
  {&(_tg__ZTV4E7x6__6G7x6y2[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y2[3]),  3,4},
  {&(_ZTV6G7x6y2[9]),  9,14},
  {&(_ZTV6G7x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI6G7x6y2[];
extern  VTBL_ENTRY _ZTV6G7x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y2[];
Class_Descriptor cd_G7x6y2 = {  "G7x6y2", // class name
  bases_G7x6y2, 6,
  &(vtc_G7x6y2[0]), // expected_vtbl_contents
  &(vtt_G7x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y3  : virtual E7x6 , virtual F1 {
  int ff;
  ~G7x6y3(); // tgen
  G7x6y3(); // tgen
};
//SIG(1 G7x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x6y3 ::~G7x6y3(){ note_dtor("G7x6y3", this);} // tgen
G7x6y3 ::G7x6y3(){ note_ctor("G7x6y3", this);} // tgen

static void Test_G7x6y3()
{
  extern Class_Descriptor cd_G7x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x6y3, buf);
    G7x6y3 *dp, &lv = *(dp=new (buf) G7x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y3)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(40,24), "G7x6y3");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), ABISELECT(16,8), "G7x6y3");
    check_base_class_offset(lv, (C7*)(E7x6*), ABISELECT(16,8), "G7x6y3");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(52,32), "G7x6y3");
    check_base_class_offset(lv, (E7x6*), ABISELECT(16,8), "G7x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G7x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x6y3.ff");
    test_class_info(&lv, &cd_G7x6y3);
    dp->~G7x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y3(Test_G7x6y3, "G7x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G7x6y3C1Ev();
extern void _ZN6G7x6y3D1Ev();
Name_Map name_map_G7x6y3[] = {
  NSPAIR(_ZN6G7x6y3C1Ev),
  NSPAIR(_ZN6G7x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y3[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G7x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G7x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y3[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y3[] = {
  {&(_ZTV6G7x6y3[6]),  6,20},
  {&(_ZTV6G7x6y3[11]),  11,20},
  {&(_ZTV6G7x6y3[15]),  15,20},
  {&(_ZTV6G7x6y3[19]),  19,20},
  {&(_tg__ZTV4E7x6__6G7x6y3[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x6y3[];
extern  VTBL_ENTRY _ZTV6G7x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y3[];
Class_Descriptor cd_G7x6y3 = {  "G7x6y3", // class name
  bases_G7x6y3, 6,
  &(vtc_G7x6y3[0]), // expected_vtbl_contents
  &(vtt_G7x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G7x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y4  : E7x6 , F0 {
  int ff;
  ~G7x6y4(); // tgen
  G7x6y4(); // tgen
};
//SIG(1 G7x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G7x6y4 ::~G7x6y4(){ note_dtor("G7x6y4", this);} // tgen
G7x6y4 ::G7x6y4(){ note_ctor("G7x6y4", this);} // tgen

static void Test_G7x6y4()
{
  extern Class_Descriptor cd_G7x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x6y4, buf);
    G7x6y4 *dp, &lv = *(dp=new (buf) G7x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y4)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(32,24), "G7x6y4");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), 0, "G7x6y4");
    check_base_class_offset(lv, (C7*)(E7x6*), 0, "G7x6y4");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(44,32), "G7x6y4");
    check_base_class_offset(lv, (E7x6*), 0, "G7x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G7x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G7x6y4.ff");
    test_class_info(&lv, &cd_G7x6y4);
    dp->~G7x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y4(Test_G7x6y4, "G7x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G7x6y4C1Ev();
extern void _ZN6G7x6y4D1Ev();
Name_Map name_map_G7x6y4[] = {
  NSPAIR(_ZN6G7x6y4C1Ev),
  NSPAIR(_ZN6G7x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y4[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y4[] = {
  {&(_ZTV6G7x6y4[4]),  4,9},
  {&(_tg__ZTV4E7x6__6G7x6y4[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y4[3]),  3,4},
  {&(_ZTV6G7x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G7x6y4[];
extern  VTBL_ENTRY _ZTV6G7x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y4[];
Class_Descriptor cd_G7x6y4 = {  "G7x6y4", // class name
  bases_G7x6y4, 6,
  &(vtc_G7x6y4[0]), // expected_vtbl_contents
  &(vtt_G7x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G7x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y5  : virtual E7x6 , F0 {
  int ff;
  ~G7x6y5(); // tgen
  G7x6y5(); // tgen
};
//SIG(1 G7x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G7x6y5 ::~G7x6y5(){ note_dtor("G7x6y5", this);} // tgen
G7x6y5 ::G7x6y5(){ note_ctor("G7x6y5", this);} // tgen

static void Test_G7x6y5()
{
  extern Class_Descriptor cd_G7x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x6y5, buf);
    G7x6y5 *dp, &lv = *(dp=new (buf) G7x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y5)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(40,28), "G7x6y5");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), ABISELECT(16,12), "G7x6y5");
    check_base_class_offset(lv, (C7*)(E7x6*), ABISELECT(16,12), "G7x6y5");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(52,36), "G7x6y5");
    check_base_class_offset(lv, (E7x6*), ABISELECT(16,12), "G7x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x6y5.ff");
    test_class_info(&lv, &cd_G7x6y5);
    dp->~G7x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y5(Test_G7x6y5, "G7x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x6y5C1Ev();
extern void _ZN6G7x6y5D1Ev();
Name_Map name_map_G7x6y5[] = {
  NSPAIR(_ZN6G7x6y5C1Ev),
  NSPAIR(_ZN6G7x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y5[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y5[] = {
  {&(_ZTV6G7x6y5[5]),  5,15},
  {&(_ZTV6G7x6y5[10]),  10,15},
  {&(_ZTV6G7x6y5[14]),  14,15},
  {&(_tg__ZTV4E7x6__6G7x6y5[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x6y5[];
extern  VTBL_ENTRY _ZTV6G7x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y5[];
Class_Descriptor cd_G7x6y5 = {  "G7x6y5", // class name
  bases_G7x6y5, 6,
  &(vtc_G7x6y5[0]), // expected_vtbl_contents
  &(vtt_G7x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y6  : E7x6 , virtual F0 {
  int ff;
  ~G7x6y6(); // tgen
  G7x6y6(); // tgen
};
//SIG(1 G7x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x6y6 ::~G7x6y6(){ note_dtor("G7x6y6", this);} // tgen
G7x6y6 ::G7x6y6(){ note_ctor("G7x6y6", this);} // tgen

static void Test_G7x6y6()
{
  extern Class_Descriptor cd_G7x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G7x6y6, buf);
    G7x6y6 *dp, &lv = *(dp=new (buf) G7x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G7x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y6)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(24,20), "G7x6y6");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), 0, "G7x6y6");
    check_base_class_offset(lv, (C7*)(E7x6*), 0, "G7x6y6");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(36,28), "G7x6y6");
    check_base_class_offset(lv, (E7x6*), 0, "G7x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G7x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G7x6y6.ff");
    test_class_info(&lv, &cd_G7x6y6);
    dp->~G7x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y6(Test_G7x6y6, "G7x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G7x6y6C1Ev();
extern void _ZN6G7x6y6D1Ev();
Name_Map name_map_G7x6y6[] = {
  NSPAIR(_ZN6G7x6y6C1Ev),
  NSPAIR(_ZN6G7x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y6[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI6G7x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y6[] = {
  {&(_ZTV6G7x6y6[5]),  5,10},
  {&(_tg__ZTV4E7x6__6G7x6y6[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y6[3]),  3,4},
  {&(_ZTV6G7x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G7x6y6[];
extern  VTBL_ENTRY _ZTV6G7x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y6[];
Class_Descriptor cd_G7x6y6 = {  "G7x6y6", // class name
  bases_G7x6y6, 6,
  &(vtc_G7x6y6[0]), // expected_vtbl_contents
  &(vtt_G7x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G7x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x6y7  : virtual E7x6 , virtual F0 {
  int ff;
  ~G7x6y7(); // tgen
  G7x6y7(); // tgen
};
//SIG(1 G7x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x6y7 ::~G7x6y7(){ note_dtor("G7x6y7", this);} // tgen
G7x6y7 ::G7x6y7(){ note_ctor("G7x6y7", this);} // tgen

static void Test_G7x6y7()
{
  extern Class_Descriptor cd_G7x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G7x6y7, buf);
    G7x6y7 *dp, &lv = *(dp=new (buf) G7x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G7x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x6y7)");
    check_base_class_offset(lv, (A1*)(C7*)(E7x6*), ABISELECT(40,24), "G7x6y7");
    check_base_class_offset(lv, (B1*)(C7*)(E7x6*), ABISELECT(16,8), "G7x6y7");
    check_base_class_offset(lv, (C7*)(E7x6*), ABISELECT(16,8), "G7x6y7");
    check_base_class_offset(lv, (D0*)(E7x6*), ABISELECT(52,32), "G7x6y7");
    check_base_class_offset(lv, (E7x6*), ABISELECT(16,8), "G7x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G7x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x6y7.ff");
    test_class_info(&lv, &cd_G7x6y7);
    dp->~G7x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x6y7(Test_G7x6y7, "G7x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G7x6y7C1Ev();
extern void _ZN6G7x6y7D1Ev();
Name_Map name_map_G7x6y7[] = {
  NSPAIR(_ZN6G7x6y7C1Ev),
  NSPAIR(_ZN6G7x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x6;
extern VTBL_ENTRY _ZTI4E7x6[];
extern  VTBL_ENTRY _ZTV4E7x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x6y7[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G7x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV4E7x6__6G7x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C74E7x6__6G7x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C74E7x6__6G7x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x6__6G7x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x6y7[] = {
  {&(_ZTV6G7x6y7[6]),  6,16},
  {&(_ZTV6G7x6y7[11]),  11,16},
  {&(_ZTV6G7x6y7[15]),  15,16},
  {&(_tg__ZTV4E7x6__6G7x6y7[4]),  4,5},
  {&(_tg__ZTV2C74E7x6__6G7x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C74E7x6__6G7x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__4E7x6__6G7x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x6y7[];
extern  VTBL_ENTRY _ZTV6G7x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x6y7[];
Class_Descriptor cd_G7x6y7 = {  "G7x6y7", // class name
  bases_G7x6y7, 6,
  &(vtc_G7x6y7[0]), // expected_vtbl_contents
  &(vtt_G7x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G7x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x6y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x6y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x6  : C8 , virtual D0 {
  int fd;
  ~E8x6(); // tgen
  E8x6(); // tgen
};
//SIG(-1 E8x6) C1{ BC2{ BC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E8x6 ::~E8x6(){ note_dtor("E8x6", this);} // tgen
E8x6 ::E8x6(){ note_ctor("E8x6", this);} // tgen

static void Test_E8x6()
{
  extern Class_Descriptor cd_E8x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E8x6, buf);
    E8x6 *dp, &lv = *(dp=new (buf) E8x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E8x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x6)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(8,4), "E8x6");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(20,16), "E8x6");
    check_base_class_offset(lv, (C8*), 0, "E8x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E8x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E8x6.fd");
    test_class_info(&lv, &cd_E8x6);
    dp->~E8x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x6(Test_E8x6, "E8x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E8x6C1Ev();
extern void _ZN4E8x6D1Ev();
Name_Map name_map_E8x6[] = {
  NSPAIR(_ZN4E8x6C1Ev),
  NSPAIR(_ZN4E8x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E8x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E8x6[];
static  VTBL_ENTRY vtc_E8x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
extern VTBL_ENTRY _ZTV4E8x6[];
static  VTBL_ENTRY _tg__ZTV2C8__4E8x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x6[] = {
  {&(_ZTV4E8x6[4]),  4,4},
  {&(_tg__ZTV2C8__4E8x6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
Class_Descriptor cd_E8x6 = {  "E8x6", // class name
  bases_E8x6, 4,
  &(vtc_E8x6[0]), // expected_vtbl_contents
  &(vtt_E8x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E8x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E8x6),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E8x6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y0  : E8x6 , F1 {
  int ff;
  ~G8x6y0(); // tgen
  G8x6y0(); // tgen
};
//SIG(1 G8x6y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x6y0 ::~G8x6y0(){ note_dtor("G8x6y0", this);} // tgen
G8x6y0 ::G8x6y0(){ note_ctor("G8x6y0", this);} // tgen

static void Test_G8x6y0()
{
  extern Class_Descriptor cd_G8x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x6y0, buf);
    G8x6y0 *dp, &lv = *(dp=new (buf) G8x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y0)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(8,4), "G8x6y0");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(40,28), "G8x6y0");
    check_base_class_offset(lv, (C8*)(E8x6*), 0, "G8x6y0");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(44,32), "G8x6y0");
    check_base_class_offset(lv, (E8x6*), 0, "G8x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G8x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G8x6y0.ff");
    test_class_info(&lv, &cd_G8x6y0);
    dp->~G8x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y0(Test_G8x6y0, "G8x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x6y0C1Ev();
extern void _ZN6G8x6y0D1Ev();
Name_Map name_map_G8x6y0[] = {
  NSPAIR(_ZN6G8x6y0C1Ev),
  NSPAIR(_ZN6G8x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G8x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x6y0[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y0[] = {
  {&(_ZTV6G8x6y0[4]),  4,7},
  {&(_tg__ZTV4E8x6__6G8x6y0[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y0[];
extern  VTBL_ENTRY _ZTV6G8x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y0[];
Class_Descriptor cd_G8x6y0 = {  "G8x6y0", // class name
  bases_G8x6y0, 6,
  &(vtc_G8x6y0[0]), // expected_vtbl_contents
  &(vtt_G8x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y0),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y1  : virtual E8x6 , F1 {
  int ff;
  ~G8x6y1(); // tgen
  G8x6y1(); // tgen
};
//SIG(1 G8x6y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x6y1 ::~G8x6y1(){ note_dtor("G8x6y1", this);} // tgen
G8x6y1 ::G8x6y1(){ note_ctor("G8x6y1", this);} // tgen

static void Test_G8x6y1()
{
  extern Class_Descriptor cd_G8x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x6y1, buf);
    G8x6y1 *dp, &lv = *(dp=new (buf) G8x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y1)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(24,16), "G8x6y1");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(36,28), "G8x6y1");
    check_base_class_offset(lv, (C8*)(E8x6*), ABISELECT(16,12), "G8x6y1");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(40,32), "G8x6y1");
    check_base_class_offset(lv, (E8x6*), ABISELECT(16,12), "G8x6y1");
    check_base_class_offset(lv, (F1*), 0, "G8x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x6y1.ff");
    test_class_info(&lv, &cd_G8x6y1);
    dp->~G8x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y1(Test_G8x6y1, "G8x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x6y1C1Ev();
extern void _ZN6G8x6y1D1Ev();
Name_Map name_map_G8x6y1[] = {
  NSPAIR(_ZN6G8x6y1C1Ev),
  NSPAIR(_ZN6G8x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x6y1[0]),
};
extern VTBL_ENTRY _ZTV6G8x6y1[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y1[] = {
  {&(_ZTV6G8x6y1[5]),  5,10},
  {&(_ZTV6G8x6y1[10]),  10,10},
  {&(_tg__ZTV4E8x6__6G8x6y1[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y1[];
extern  VTBL_ENTRY _ZTV6G8x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y1[];
Class_Descriptor cd_G8x6y1 = {  "G8x6y1", // class name
  bases_G8x6y1, 6,
  &(vtc_G8x6y1[0]), // expected_vtbl_contents
  &(vtt_G8x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y1),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y2  : E8x6 , virtual F1 {
  int ff;
  ~G8x6y2(); // tgen
  G8x6y2(); // tgen
};
//SIG(1 G8x6y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x6y2 ::~G8x6y2(){ note_dtor("G8x6y2", this);} // tgen
G8x6y2 ::G8x6y2(){ note_ctor("G8x6y2", this);} // tgen

static void Test_G8x6y2()
{
  extern Class_Descriptor cd_G8x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x6y2, buf);
    G8x6y2 *dp, &lv = *(dp=new (buf) G8x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y2)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(8,4), "G8x6y2");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(24,20), "G8x6y2");
    check_base_class_offset(lv, (C8*)(E8x6*), 0, "G8x6y2");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(28,24), "G8x6y2");
    check_base_class_offset(lv, (E8x6*), 0, "G8x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G8x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G8x6y2.ff");
    test_class_info(&lv, &cd_G8x6y2);
    dp->~G8x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y2(Test_G8x6y2, "G8x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x6y2C1Ev();
extern void _ZN6G8x6y2D1Ev();
Name_Map name_map_G8x6y2[] = {
  NSPAIR(_ZN6G8x6y2C1Ev),
  NSPAIR(_ZN6G8x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G8x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x6y2[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y2[] = {
  {&(_ZTV6G8x6y2[5]),  5,9},
  {&(_tg__ZTV4E8x6__6G8x6y2[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y2[3]),  3,3},
  {&(_ZTV6G8x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G8x6y2[];
extern  VTBL_ENTRY _ZTV6G8x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y2[];
Class_Descriptor cd_G8x6y2 = {  "G8x6y2", // class name
  bases_G8x6y2, 6,
  &(vtc_G8x6y2[0]), // expected_vtbl_contents
  &(vtt_G8x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y2),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y3  : virtual E8x6 , virtual F1 {
  int ff;
  ~G8x6y3(); // tgen
  G8x6y3(); // tgen
};
//SIG(1 G8x6y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x6y3 ::~G8x6y3(){ note_dtor("G8x6y3", this);} // tgen
G8x6y3 ::G8x6y3(){ note_ctor("G8x6y3", this);} // tgen

static void Test_G8x6y3()
{
  extern Class_Descriptor cd_G8x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x6y3, buf);
    G8x6y3 *dp, &lv = *(dp=new (buf) G8x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y3)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(24,12), "G8x6y3");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(36,24), "G8x6y3");
    check_base_class_offset(lv, (C8*)(E8x6*), ABISELECT(16,8), "G8x6y3");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(40,28), "G8x6y3");
    check_base_class_offset(lv, (E8x6*), ABISELECT(16,8), "G8x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G8x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x6y3.ff");
    test_class_info(&lv, &cd_G8x6y3);
    dp->~G8x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y3(Test_G8x6y3, "G8x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G8x6y3C1Ev();
extern void _ZN6G8x6y3D1Ev();
Name_Map name_map_G8x6y3[] = {
  NSPAIR(_ZN6G8x6y3C1Ev),
  NSPAIR(_ZN6G8x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y3[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x6y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G8x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x6y3[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y3[] = {
  {&(_ZTV6G8x6y3[6]),  6,14},
  {&(_ZTV6G8x6y3[10]),  10,14},
  {&(_ZTV6G8x6y3[13]),  13,14},
  {&(_tg__ZTV4E8x6__6G8x6y3[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y3[];
extern  VTBL_ENTRY _ZTV6G8x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y3[];
Class_Descriptor cd_G8x6y3 = {  "G8x6y3", // class name
  bases_G8x6y3, 6,
  &(vtc_G8x6y3[0]), // expected_vtbl_contents
  &(vtt_G8x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G8x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y3),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y4  : E8x6 , F0 {
  int ff;
  ~G8x6y4(); // tgen
  G8x6y4(); // tgen
};
//SIG(1 G8x6y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G8x6y4 ::~G8x6y4(){ note_dtor("G8x6y4", this);} // tgen
G8x6y4 ::G8x6y4(){ note_ctor("G8x6y4", this);} // tgen

static void Test_G8x6y4()
{
  extern Class_Descriptor cd_G8x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x6y4, buf);
    G8x6y4 *dp, &lv = *(dp=new (buf) G8x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y4)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(8,4), "G8x6y4");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(28,24), "G8x6y4");
    check_base_class_offset(lv, (C8*)(E8x6*), 0, "G8x6y4");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(32,28), "G8x6y4");
    check_base_class_offset(lv, (E8x6*), 0, "G8x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G8x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G8x6y4.ff");
    test_class_info(&lv, &cd_G8x6y4);
    dp->~G8x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y4(Test_G8x6y4, "G8x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G8x6y4C1Ev();
extern void _ZN6G8x6y4D1Ev();
Name_Map name_map_G8x6y4[] = {
  NSPAIR(_ZN6G8x6y4C1Ev),
  NSPAIR(_ZN6G8x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y4[];
static  VTBL_ENTRY vtc_G8x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y4[0]),
};
extern VTBL_ENTRY _ZTV6G8x6y4[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y4[] = {
  {&(_ZTV6G8x6y4[4]),  4,4},
  {&(_tg__ZTV4E8x6__6G8x6y4[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y4[];
extern  VTBL_ENTRY _ZTV6G8x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y4[];
Class_Descriptor cd_G8x6y4 = {  "G8x6y4", // class name
  bases_G8x6y4, 6,
  &(vtc_G8x6y4[0]), // expected_vtbl_contents
  &(vtt_G8x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G8x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y4),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y5  : virtual E8x6 , F0 {
  int ff;
  ~G8x6y5(); // tgen
  G8x6y5(); // tgen
};
//SIG(1 G8x6y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G8x6y5 ::~G8x6y5(){ note_dtor("G8x6y5", this);} // tgen
G8x6y5 ::G8x6y5(){ note_ctor("G8x6y5", this);} // tgen

static void Test_G8x6y5()
{
  extern Class_Descriptor cd_G8x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x6y5, buf);
    G8x6y5 *dp, &lv = *(dp=new (buf) G8x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y5)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(24,16), "G8x6y5");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(36,28), "G8x6y5");
    check_base_class_offset(lv, (C8*)(E8x6*), ABISELECT(16,12), "G8x6y5");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(40,32), "G8x6y5");
    check_base_class_offset(lv, (E8x6*), ABISELECT(16,12), "G8x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x6y5.ff");
    test_class_info(&lv, &cd_G8x6y5);
    dp->~G8x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y5(Test_G8x6y5, "G8x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x6y5C1Ev();
extern void _ZN6G8x6y5D1Ev();
Name_Map name_map_G8x6y5[] = {
  NSPAIR(_ZN6G8x6y5C1Ev),
  NSPAIR(_ZN6G8x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y5[];
static  VTBL_ENTRY vtc_G8x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y5[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x6y5[0]),
};
extern VTBL_ENTRY _ZTV6G8x6y5[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y5[] = {
  {&(_ZTV6G8x6y5[5]),  5,9},
  {&(_ZTV6G8x6y5[9]),  9,9},
  {&(_tg__ZTV4E8x6__6G8x6y5[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y5[];
extern  VTBL_ENTRY _ZTV6G8x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y5[];
Class_Descriptor cd_G8x6y5 = {  "G8x6y5", // class name
  bases_G8x6y5, 6,
  &(vtc_G8x6y5[0]), // expected_vtbl_contents
  &(vtt_G8x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y5),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y6  : E8x6 , virtual F0 {
  int ff;
  ~G8x6y6(); // tgen
  G8x6y6(); // tgen
};
//SIG(1 G8x6y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x6y6 ::~G8x6y6(){ note_dtor("G8x6y6", this);} // tgen
G8x6y6 ::G8x6y6(){ note_ctor("G8x6y6", this);} // tgen

static void Test_G8x6y6()
{
  extern Class_Descriptor cd_G8x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G8x6y6, buf);
    G8x6y6 *dp, &lv = *(dp=new (buf) G8x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G8x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y6)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(8,4), "G8x6y6");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(24,20), "G8x6y6");
    check_base_class_offset(lv, (C8*)(E8x6*), 0, "G8x6y6");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(28,24), "G8x6y6");
    check_base_class_offset(lv, (E8x6*), 0, "G8x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G8x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G8x6y6.ff");
    test_class_info(&lv, &cd_G8x6y6);
    dp->~G8x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y6(Test_G8x6y6, "G8x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G8x6y6C1Ev();
extern void _ZN6G8x6y6D1Ev();
Name_Map name_map_G8x6y6[] = {
  NSPAIR(_ZN6G8x6y6C1Ev),
  NSPAIR(_ZN6G8x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y6[];
static  VTBL_ENTRY vtc_G8x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y6[0]),
};
extern VTBL_ENTRY _ZTV6G8x6y6[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y6[] = {
  {&(_ZTV6G8x6y6[5]),  5,5},
  {&(_tg__ZTV4E8x6__6G8x6y6[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y6[];
extern  VTBL_ENTRY _ZTV6G8x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y6[];
Class_Descriptor cd_G8x6y6 = {  "G8x6y6", // class name
  bases_G8x6y6, 6,
  &(vtc_G8x6y6[0]), // expected_vtbl_contents
  &(vtt_G8x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G8x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y6),5, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x6y7  : virtual E8x6 , virtual F0 {
  int ff;
  ~G8x6y7(); // tgen
  G8x6y7(); // tgen
};
//SIG(1 G8x6y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x6y7 ::~G8x6y7(){ note_dtor("G8x6y7", this);} // tgen
G8x6y7 ::G8x6y7(){ note_ctor("G8x6y7", this);} // tgen

static void Test_G8x6y7()
{
  extern Class_Descriptor cd_G8x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x6y7, buf);
    G8x6y7 *dp, &lv = *(dp=new (buf) G8x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x6y7)");
    check_base_class_offset(lv, (A0*)(C8*)(E8x6*), ABISELECT(24,12), "G8x6y7");
    check_base_class_offset(lv, (B0*)(C8*)(E8x6*), ABISELECT(36,24), "G8x6y7");
    check_base_class_offset(lv, (C8*)(E8x6*), ABISELECT(16,8), "G8x6y7");
    check_base_class_offset(lv, (D0*)(E8x6*), ABISELECT(40,28), "G8x6y7");
    check_base_class_offset(lv, (E8x6*), ABISELECT(16,8), "G8x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G8x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x6y7.ff");
    test_class_info(&lv, &cd_G8x6y7);
    dp->~G8x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x6y7(Test_G8x6y7, "G8x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x6y7C1Ev();
extern void _ZN6G8x6y7D1Ev();
Name_Map name_map_G8x6y7[] = {
  NSPAIR(_ZN6G8x6y7C1Ev),
  NSPAIR(_ZN6G8x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x6;
extern VTBL_ENTRY _ZTI4E8x6[];
extern  VTBL_ENTRY _ZTV4E8x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x6y7[];
static  VTBL_ENTRY vtc_G8x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x6y7[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x6y7[0]),
};
extern VTBL_ENTRY _ZTV6G8x6y7[];
static  VTBL_ENTRY _tg__ZTV4E8x6__6G8x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x6[0]),
};
static  VTBL_ENTRY _tg__ZTV2C84E8x6__6G8x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x6y7[] = {
  {&(_ZTV6G8x6y7[6]),  6,10},
  {&(_ZTV6G8x6y7[10]),  10,10},
  {&(_tg__ZTV4E8x6__6G8x6y7[4]),  4,4},
  {&(_tg__ZTV2C84E8x6__6G8x6y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x6y7[];
extern  VTBL_ENTRY _ZTV6G8x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x6y7[];
Class_Descriptor cd_G8x6y7 = {  "G8x6y7", // class name
  bases_G8x6y7, 6,
  &(vtc_G8x6y7[0]), // expected_vtbl_contents
  &(vtt_G8x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x6y7),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x6y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E9x6  : C9 , virtual D0 {
  int fd;
  ~E9x6(); // tgen
  E9x6(); // tgen
};
//SIG(-1 E9x6) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E9x6 ::~E9x6(){ note_dtor("E9x6", this);} // tgen
E9x6 ::E9x6(){ note_ctor("E9x6", this);} // tgen

static void Test_E9x6()
{
  extern Class_Descriptor cd_E9x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E9x6, buf);
    E9x6 *dp, &lv = *(dp=new (buf) E9x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E9x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x6)");
    check_base_class_offset(lv, (A1*)(C9*), 0, "E9x6");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(20,16), "E9x6");
    check_base_class_offset(lv, (C9*), 0, "E9x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E9x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E9x6.fd");
    test_class_info(&lv, &cd_E9x6);
    dp->~E9x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x6(Test_E9x6, "E9x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E9x6C1Ev();
extern void _ZN4E9x6D1Ev();
Name_Map name_map_E9x6[] = {
  NSPAIR(_ZN4E9x6C1Ev),
  NSPAIR(_ZN4E9x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E9x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E9x6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E9x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E9x6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x6[] = {
  {&(_ZTV4E9x6[4]),  4,5},
  {&(_tg__ZTV2C9__4E9x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
Class_Descriptor cd_E9x6 = {  "E9x6", // class name
  bases_E9x6, 4,
  &(vtc_E9x6[0]), // expected_vtbl_contents
  &(vtt_E9x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E9x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E9x6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E9x6),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y0  : E9x6 , F1 {
  int ff;
  ~G9x6y0(); // tgen
  G9x6y0(); // tgen
};
//SIG(1 G9x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x6y0 ::~G9x6y0(){ note_dtor("G9x6y0", this);} // tgen
G9x6y0 ::G9x6y0(){ note_ctor("G9x6y0", this);} // tgen

static void Test_G9x6y0()
{
  extern Class_Descriptor cd_G9x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x6y0, buf);
    G9x6y0 *dp, &lv = *(dp=new (buf) G9x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y0)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), 0, "G9x6y0");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(40,28), "G9x6y0");
    check_base_class_offset(lv, (C9*)(E9x6*), 0, "G9x6y0");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(44,32), "G9x6y0");
    check_base_class_offset(lv, (E9x6*), 0, "G9x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G9x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G9x6y0.ff");
    test_class_info(&lv, &cd_G9x6y0);
    dp->~G9x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y0(Test_G9x6y0, "G9x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x6y0C1Ev();
extern void _ZN6G9x6y0D1Ev();
Name_Map name_map_G9x6y0[] = {
  NSPAIR(_ZN6G9x6y0C1Ev),
  NSPAIR(_ZN6G9x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y0[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G9x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y0[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y0[] = {
  {&(_ZTV6G9x6y0[4]),  4,8},
  {&(_tg__ZTV4E9x6__6G9x6y0[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y0[];
extern  VTBL_ENTRY _ZTV6G9x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y0[];
Class_Descriptor cd_G9x6y0 = {  "G9x6y0", // class name
  bases_G9x6y0, 6,
  &(vtc_G9x6y0[0]), // expected_vtbl_contents
  &(vtt_G9x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y1  : virtual E9x6 , F1 {
  int ff;
  ~G9x6y1(); // tgen
  G9x6y1(); // tgen
};
//SIG(1 G9x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x6y1 ::~G9x6y1(){ note_dtor("G9x6y1", this);} // tgen
G9x6y1 ::G9x6y1(){ note_ctor("G9x6y1", this);} // tgen

static void Test_G9x6y1()
{
  extern Class_Descriptor cd_G9x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x6y1, buf);
    G9x6y1 *dp, &lv = *(dp=new (buf) G9x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y1)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), ABISELECT(16,12), "G9x6y1");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(36,28), "G9x6y1");
    check_base_class_offset(lv, (C9*)(E9x6*), ABISELECT(16,12), "G9x6y1");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(40,32), "G9x6y1");
    check_base_class_offset(lv, (E9x6*), ABISELECT(16,12), "G9x6y1");
    check_base_class_offset(lv, (F1*), 0, "G9x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x6y1.ff");
    test_class_info(&lv, &cd_G9x6y1);
    dp->~G9x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y1(Test_G9x6y1, "G9x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x6y1C1Ev();
extern void _ZN6G9x6y1D1Ev();
Name_Map name_map_G9x6y1[] = {
  NSPAIR(_ZN6G9x6y1C1Ev),
  NSPAIR(_ZN6G9x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y1[] = {
  {&(_ZTV6G9x6y1[5]),  5,12},
  {&(_ZTV6G9x6y1[11]),  11,12},
  {&(_tg__ZTV4E9x6__6G9x6y1[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y1[];
extern  VTBL_ENTRY _ZTV6G9x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y1[];
Class_Descriptor cd_G9x6y1 = {  "G9x6y1", // class name
  bases_G9x6y1, 6,
  &(vtc_G9x6y1[0]), // expected_vtbl_contents
  &(vtt_G9x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y2  : E9x6 , virtual F1 {
  int ff;
  ~G9x6y2(); // tgen
  G9x6y2(); // tgen
};
//SIG(1 G9x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x6y2 ::~G9x6y2(){ note_dtor("G9x6y2", this);} // tgen
G9x6y2 ::G9x6y2(){ note_ctor("G9x6y2", this);} // tgen

static void Test_G9x6y2()
{
  extern Class_Descriptor cd_G9x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x6y2, buf);
    G9x6y2 *dp, &lv = *(dp=new (buf) G9x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y2)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), 0, "G9x6y2");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(24,20), "G9x6y2");
    check_base_class_offset(lv, (C9*)(E9x6*), 0, "G9x6y2");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(28,24), "G9x6y2");
    check_base_class_offset(lv, (E9x6*), 0, "G9x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G9x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G9x6y2.ff");
    test_class_info(&lv, &cd_G9x6y2);
    dp->~G9x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y2(Test_G9x6y2, "G9x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x6y2C1Ev();
extern void _ZN6G9x6y2D1Ev();
Name_Map name_map_G9x6y2[] = {
  NSPAIR(_ZN6G9x6y2C1Ev),
  NSPAIR(_ZN6G9x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G9x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y2[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y2[] = {
  {&(_ZTV6G9x6y2[5]),  5,10},
  {&(_tg__ZTV4E9x6__6G9x6y2[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y2[3]),  3,4},
  {&(_ZTV6G9x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI6G9x6y2[];
extern  VTBL_ENTRY _ZTV6G9x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y2[];
Class_Descriptor cd_G9x6y2 = {  "G9x6y2", // class name
  bases_G9x6y2, 6,
  &(vtc_G9x6y2[0]), // expected_vtbl_contents
  &(vtt_G9x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y3  : virtual E9x6 , virtual F1 {
  int ff;
  ~G9x6y3(); // tgen
  G9x6y3(); // tgen
};
//SIG(1 G9x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x6y3 ::~G9x6y3(){ note_dtor("G9x6y3", this);} // tgen
G9x6y3 ::G9x6y3(){ note_ctor("G9x6y3", this);} // tgen

static void Test_G9x6y3()
{
  extern Class_Descriptor cd_G9x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x6y3, buf);
    G9x6y3 *dp, &lv = *(dp=new (buf) G9x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y3)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), ABISELECT(16,8), "G9x6y3");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(36,24), "G9x6y3");
    check_base_class_offset(lv, (C9*)(E9x6*), ABISELECT(16,8), "G9x6y3");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(40,28), "G9x6y3");
    check_base_class_offset(lv, (E9x6*), ABISELECT(16,8), "G9x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G9x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x6y3.ff");
    test_class_info(&lv, &cd_G9x6y3);
    dp->~G9x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y3(Test_G9x6y3, "G9x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G9x6y3C1Ev();
extern void _ZN6G9x6y3D1Ev();
Name_Map name_map_G9x6y3[] = {
  NSPAIR(_ZN6G9x6y3C1Ev),
  NSPAIR(_ZN6G9x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G9x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y3[] = {
  {&(_ZTV6G9x6y3[6]),  6,16},
  {&(_ZTV6G9x6y3[11]),  11,16},
  {&(_ZTV6G9x6y3[15]),  15,16},
  {&(_tg__ZTV4E9x6__6G9x6y3[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y3[];
extern  VTBL_ENTRY _ZTV6G9x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y3[];
Class_Descriptor cd_G9x6y3 = {  "G9x6y3", // class name
  bases_G9x6y3, 6,
  &(vtc_G9x6y3[0]), // expected_vtbl_contents
  &(vtt_G9x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G9x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y4  : E9x6 , F0 {
  int ff;
  ~G9x6y4(); // tgen
  G9x6y4(); // tgen
};
//SIG(1 G9x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G9x6y4 ::~G9x6y4(){ note_dtor("G9x6y4", this);} // tgen
G9x6y4 ::G9x6y4(){ note_ctor("G9x6y4", this);} // tgen

static void Test_G9x6y4()
{
  extern Class_Descriptor cd_G9x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x6y4, buf);
    G9x6y4 *dp, &lv = *(dp=new (buf) G9x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y4)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), 0, "G9x6y4");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(28,24), "G9x6y4");
    check_base_class_offset(lv, (C9*)(E9x6*), 0, "G9x6y4");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(32,28), "G9x6y4");
    check_base_class_offset(lv, (E9x6*), 0, "G9x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G9x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G9x6y4.ff");
    test_class_info(&lv, &cd_G9x6y4);
    dp->~G9x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y4(Test_G9x6y4, "G9x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G9x6y4C1Ev();
extern void _ZN6G9x6y4D1Ev();
Name_Map name_map_G9x6y4[] = {
  NSPAIR(_ZN6G9x6y4C1Ev),
  NSPAIR(_ZN6G9x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y4[] = {
  {&(_ZTV6G9x6y4[4]),  4,5},
  {&(_tg__ZTV4E9x6__6G9x6y4[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y4[];
extern  VTBL_ENTRY _ZTV6G9x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y4[];
Class_Descriptor cd_G9x6y4 = {  "G9x6y4", // class name
  bases_G9x6y4, 6,
  &(vtc_G9x6y4[0]), // expected_vtbl_contents
  &(vtt_G9x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G9x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y5  : virtual E9x6 , F0 {
  int ff;
  ~G9x6y5(); // tgen
  G9x6y5(); // tgen
};
//SIG(1 G9x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G9x6y5 ::~G9x6y5(){ note_dtor("G9x6y5", this);} // tgen
G9x6y5 ::G9x6y5(){ note_ctor("G9x6y5", this);} // tgen

static void Test_G9x6y5()
{
  extern Class_Descriptor cd_G9x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x6y5, buf);
    G9x6y5 *dp, &lv = *(dp=new (buf) G9x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y5)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), ABISELECT(16,12), "G9x6y5");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(36,28), "G9x6y5");
    check_base_class_offset(lv, (C9*)(E9x6*), ABISELECT(16,12), "G9x6y5");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(40,32), "G9x6y5");
    check_base_class_offset(lv, (E9x6*), ABISELECT(16,12), "G9x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x6y5.ff");
    test_class_info(&lv, &cd_G9x6y5);
    dp->~G9x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y5(Test_G9x6y5, "G9x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x6y5C1Ev();
extern void _ZN6G9x6y5D1Ev();
Name_Map name_map_G9x6y5[] = {
  NSPAIR(_ZN6G9x6y5C1Ev),
  NSPAIR(_ZN6G9x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y5[] = {
  {&(_ZTV6G9x6y5[5]),  5,11},
  {&(_ZTV6G9x6y5[10]),  10,11},
  {&(_tg__ZTV4E9x6__6G9x6y5[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y5[];
extern  VTBL_ENTRY _ZTV6G9x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y5[];
Class_Descriptor cd_G9x6y5 = {  "G9x6y5", // class name
  bases_G9x6y5, 6,
  &(vtc_G9x6y5[0]), // expected_vtbl_contents
  &(vtt_G9x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y6  : E9x6 , virtual F0 {
  int ff;
  ~G9x6y6(); // tgen
  G9x6y6(); // tgen
};
//SIG(1 G9x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x6y6 ::~G9x6y6(){ note_dtor("G9x6y6", this);} // tgen
G9x6y6 ::G9x6y6(){ note_ctor("G9x6y6", this);} // tgen

static void Test_G9x6y6()
{
  extern Class_Descriptor cd_G9x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G9x6y6, buf);
    G9x6y6 *dp, &lv = *(dp=new (buf) G9x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G9x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y6)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), 0, "G9x6y6");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(24,20), "G9x6y6");
    check_base_class_offset(lv, (C9*)(E9x6*), 0, "G9x6y6");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(28,24), "G9x6y6");
    check_base_class_offset(lv, (E9x6*), 0, "G9x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G9x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G9x6y6.ff");
    test_class_info(&lv, &cd_G9x6y6);
    dp->~G9x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y6(Test_G9x6y6, "G9x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G9x6y6C1Ev();
extern void _ZN6G9x6y6D1Ev();
Name_Map name_map_G9x6y6[] = {
  NSPAIR(_ZN6G9x6y6C1Ev),
  NSPAIR(_ZN6G9x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y6[] = {
  {&(_ZTV6G9x6y6[5]),  5,6},
  {&(_tg__ZTV4E9x6__6G9x6y6[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y6[];
extern  VTBL_ENTRY _ZTV6G9x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y6[];
Class_Descriptor cd_G9x6y6 = {  "G9x6y6", // class name
  bases_G9x6y6, 6,
  &(vtc_G9x6y6[0]), // expected_vtbl_contents
  &(vtt_G9x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G9x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x6y7  : virtual E9x6 , virtual F0 {
  int ff;
  ~G9x6y7(); // tgen
  G9x6y7(); // tgen
};
//SIG(1 G9x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x6y7 ::~G9x6y7(){ note_dtor("G9x6y7", this);} // tgen
G9x6y7 ::G9x6y7(){ note_ctor("G9x6y7", this);} // tgen

static void Test_G9x6y7()
{
  extern Class_Descriptor cd_G9x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x6y7, buf);
    G9x6y7 *dp, &lv = *(dp=new (buf) G9x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x6y7)");
    check_base_class_offset(lv, (A1*)(C9*)(E9x6*), ABISELECT(16,8), "G9x6y7");
    check_base_class_offset(lv, (B0*)(C9*)(E9x6*), ABISELECT(36,24), "G9x6y7");
    check_base_class_offset(lv, (C9*)(E9x6*), ABISELECT(16,8), "G9x6y7");
    check_base_class_offset(lv, (D0*)(E9x6*), ABISELECT(40,28), "G9x6y7");
    check_base_class_offset(lv, (E9x6*), ABISELECT(16,8), "G9x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G9x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x6y7.ff");
    test_class_info(&lv, &cd_G9x6y7);
    dp->~G9x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x6y7(Test_G9x6y7, "G9x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x6y7C1Ev();
extern void _ZN6G9x6y7D1Ev();
Name_Map name_map_G9x6y7[] = {
  NSPAIR(_ZN6G9x6y7C1Ev),
  NSPAIR(_ZN6G9x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x6;
extern VTBL_ENTRY _ZTI4E9x6[];
extern  VTBL_ENTRY _ZTV4E9x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV4E9x6__6G9x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C94E9x6__6G9x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x6y7[] = {
  {&(_ZTV6G9x6y7[6]),  6,12},
  {&(_ZTV6G9x6y7[11]),  11,12},
  {&(_tg__ZTV4E9x6__6G9x6y7[4]),  4,5},
  {&(_tg__ZTV2C94E9x6__6G9x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x6y7[];
extern  VTBL_ENTRY _ZTV6G9x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x6y7[];
Class_Descriptor cd_G9x6y7 = {  "G9x6y7", // class name
  bases_G9x6y7, 6,
  &(vtc_G9x6y7[0]), // expected_vtbl_contents
  &(vtt_G9x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x6y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x6y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E10x6  : C10 , virtual D0 {
  int fd;
  ~E10x6(); // tgen
  E10x6(); // tgen
};
//SIG(-1 E10x6) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E10x6 ::~E10x6(){ note_dtor("E10x6", this);} // tgen
E10x6 ::E10x6(){ note_ctor("E10x6", this);} // tgen

static void Test_E10x6()
{
  extern Class_Descriptor cd_E10x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E10x6, buf);
    E10x6 *dp, &lv = *(dp=new (buf) E10x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E10x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x6)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(16,12), "E10x6");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(20,16), "E10x6");
    check_base_class_offset(lv, (C10*), 0, "E10x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E10x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E10x6.fd");
    test_class_info(&lv, &cd_E10x6);
    dp->~E10x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x6(Test_E10x6, "E10x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E10x6C1Ev();
extern void _ZN5E10x6D1Ev();
Name_Map name_map_E10x6[] = {
  NSPAIR(_ZN5E10x6C1Ev),
  NSPAIR(_ZN5E10x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E10x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E10x6[];
static  VTBL_ENTRY vtc_E10x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
extern VTBL_ENTRY _ZTV5E10x6[];
static  VTBL_ENTRY _tg__ZTV3C10__5E10x6[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x6[] = {
  {&(_ZTV5E10x6[5]),  5,5},
  {&(_tg__ZTV3C10__5E10x6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
Class_Descriptor cd_E10x6 = {  "E10x6", // class name
  bases_E10x6, 4,
  &(vtc_E10x6[0]), // expected_vtbl_contents
  &(vtt_E10x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E10x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E10x6),5, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E10x6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y0  : E10x6 , F1 {
  int ff;
  ~G10x6y0(); // tgen
  G10x6y0(); // tgen
};
//SIG(1 G10x6y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x6y0 ::~G10x6y0(){ note_dtor("G10x6y0", this);} // tgen
G10x6y0 ::G10x6y0(){ note_ctor("G10x6y0", this);} // tgen

static void Test_G10x6y0()
{
  extern Class_Descriptor cd_G10x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x6y0, buf);
    G10x6y0 *dp, &lv = *(dp=new (buf) G10x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y0)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(32,24), "G10x6y0");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(36,28), "G10x6y0");
    check_base_class_offset(lv, (C10*)(E10x6*), 0, "G10x6y0");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(40,32), "G10x6y0");
    check_base_class_offset(lv, (E10x6*), 0, "G10x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G10x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G10x6y0.ff");
    test_class_info(&lv, &cd_G10x6y0);
    dp->~G10x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y0(Test_G10x6y0, "G10x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x6y0C1Ev();
extern void _ZN7G10x6y0D1Ev();
Name_Map name_map_G10x6y0[] = {
  NSPAIR(_ZN7G10x6y0C1Ev),
  NSPAIR(_ZN7G10x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x6y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x6y0[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y0[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y0[] = {
  {&(_ZTV7G10x6y0[5]),  5,8},
  {&(_tg__ZTV5E10x6__7G10x6y0[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y0[];
extern  VTBL_ENTRY _ZTV7G10x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y0[];
Class_Descriptor cd_G10x6y0 = {  "G10x6y0", // class name
  bases_G10x6y0, 6,
  &(vtc_G10x6y0[0]), // expected_vtbl_contents
  &(vtt_G10x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y0),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y1  : virtual E10x6 , F1 {
  int ff;
  ~G10x6y1(); // tgen
  G10x6y1(); // tgen
};
//SIG(1 G10x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x6y1 ::~G10x6y1(){ note_dtor("G10x6y1", this);} // tgen
G10x6y1 ::G10x6y1(){ note_ctor("G10x6y1", this);} // tgen

static void Test_G10x6y1()
{
  extern Class_Descriptor cd_G10x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x6y1, buf);
    G10x6y1 *dp, &lv = *(dp=new (buf) G10x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y1)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(32,24), "G10x6y1");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(36,28), "G10x6y1");
    check_base_class_offset(lv, (C10*)(E10x6*), ABISELECT(16,12), "G10x6y1");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(40,32), "G10x6y1");
    check_base_class_offset(lv, (E10x6*), ABISELECT(16,12), "G10x6y1");
    check_base_class_offset(lv, (F1*), 0, "G10x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x6y1.ff");
    test_class_info(&lv, &cd_G10x6y1);
    dp->~G10x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y1(Test_G10x6y1, "G10x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x6y1C1Ev();
extern void _ZN7G10x6y1D1Ev();
Name_Map name_map_G10x6y1[] = {
  NSPAIR(_ZN7G10x6y1C1Ev),
  NSPAIR(_ZN7G10x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x6y1[0]),
};
extern VTBL_ENTRY _ZTV7G10x6y1[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y1[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y1[] = {
  {&(_ZTV7G10x6y1[6]),  6,12},
  {&(_ZTV7G10x6y1[12]),  12,12},
  {&(_tg__ZTV5E10x6__7G10x6y1[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y1[];
extern  VTBL_ENTRY _ZTV7G10x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y1[];
Class_Descriptor cd_G10x6y1 = {  "G10x6y1", // class name
  bases_G10x6y1, 6,
  &(vtc_G10x6y1[0]), // expected_vtbl_contents
  &(vtt_G10x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y1),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y2  : E10x6 , virtual F1 {
  int ff;
  ~G10x6y2(); // tgen
  G10x6y2(); // tgen
};
//SIG(1 G10x6y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x6y2 ::~G10x6y2(){ note_dtor("G10x6y2", this);} // tgen
G10x6y2 ::G10x6y2(){ note_ctor("G10x6y2", this);} // tgen

static void Test_G10x6y2()
{
  extern Class_Descriptor cd_G10x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x6y2, buf);
    G10x6y2 *dp, &lv = *(dp=new (buf) G10x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y2)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(20,16), "G10x6y2");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(24,20), "G10x6y2");
    check_base_class_offset(lv, (C10*)(E10x6*), 0, "G10x6y2");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(28,24), "G10x6y2");
    check_base_class_offset(lv, (E10x6*), 0, "G10x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G10x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x6y2.ff");
    test_class_info(&lv, &cd_G10x6y2);
    dp->~G10x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y2(Test_G10x6y2, "G10x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x6y2C1Ev();
extern void _ZN7G10x6y2D1Ev();
Name_Map name_map_G10x6y2[] = {
  NSPAIR(_ZN7G10x6y2C1Ev),
  NSPAIR(_ZN7G10x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G10x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x6y2[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y2[] = {
  {&(_ZTV7G10x6y2[6]),  6,10},
  {&(_tg__ZTV5E10x6__7G10x6y2[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y2[4]),  4,4},
  {&(_ZTV7G10x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G10x6y2[];
extern  VTBL_ENTRY _ZTV7G10x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y2[];
Class_Descriptor cd_G10x6y2 = {  "G10x6y2", // class name
  bases_G10x6y2, 6,
  &(vtc_G10x6y2[0]), // expected_vtbl_contents
  &(vtt_G10x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y2),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y3  : virtual E10x6 , virtual F1 {
  int ff;
  ~G10x6y3(); // tgen
  G10x6y3(); // tgen
};
//SIG(1 G10x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x6y3 ::~G10x6y3(){ note_dtor("G10x6y3", this);} // tgen
G10x6y3 ::G10x6y3(){ note_ctor("G10x6y3", this);} // tgen

static void Test_G10x6y3()
{
  extern Class_Descriptor cd_G10x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x6y3, buf);
    G10x6y3 *dp, &lv = *(dp=new (buf) G10x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y3)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(32,20), "G10x6y3");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(36,24), "G10x6y3");
    check_base_class_offset(lv, (C10*)(E10x6*), ABISELECT(16,8), "G10x6y3");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(40,28), "G10x6y3");
    check_base_class_offset(lv, (E10x6*), ABISELECT(16,8), "G10x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G10x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x6y3.ff");
    test_class_info(&lv, &cd_G10x6y3);
    dp->~G10x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y3(Test_G10x6y3, "G10x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G10x6y3C1Ev();
extern void _ZN7G10x6y3D1Ev();
Name_Map name_map_G10x6y3[] = {
  NSPAIR(_ZN7G10x6y3C1Ev),
  NSPAIR(_ZN7G10x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y3[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x6y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G10x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x6y3[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y3[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y3[] = {
  {&(_ZTV7G10x6y3[7]),  7,16},
  {&(_ZTV7G10x6y3[12]),  12,16},
  {&(_ZTV7G10x6y3[15]),  15,16},
  {&(_tg__ZTV5E10x6__7G10x6y3[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y3[];
extern  VTBL_ENTRY _ZTV7G10x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y3[];
Class_Descriptor cd_G10x6y3 = {  "G10x6y3", // class name
  bases_G10x6y3, 6,
  &(vtc_G10x6y3[0]), // expected_vtbl_contents
  &(vtt_G10x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G10x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y3),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y4  : E10x6 , F0 {
  int ff;
  ~G10x6y4(); // tgen
  G10x6y4(); // tgen
};
//SIG(1 G10x6y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G10x6y4 ::~G10x6y4(){ note_dtor("G10x6y4", this);} // tgen
G10x6y4 ::G10x6y4(){ note_ctor("G10x6y4", this);} // tgen

static void Test_G10x6y4()
{
  extern Class_Descriptor cd_G10x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x6y4, buf);
    G10x6y4 *dp, &lv = *(dp=new (buf) G10x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y4)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(24,20), "G10x6y4");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(28,24), "G10x6y4");
    check_base_class_offset(lv, (C10*)(E10x6*), 0, "G10x6y4");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(32,28), "G10x6y4");
    check_base_class_offset(lv, (E10x6*), 0, "G10x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G10x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G10x6y4.ff");
    test_class_info(&lv, &cd_G10x6y4);
    dp->~G10x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y4(Test_G10x6y4, "G10x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G10x6y4C1Ev();
extern void _ZN7G10x6y4D1Ev();
Name_Map name_map_G10x6y4[] = {
  NSPAIR(_ZN7G10x6y4C1Ev),
  NSPAIR(_ZN7G10x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y4[];
static  VTBL_ENTRY vtc_G10x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y4[0]),
};
extern VTBL_ENTRY _ZTV7G10x6y4[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y4[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y4[] = {
  {&(_ZTV7G10x6y4[5]),  5,5},
  {&(_tg__ZTV5E10x6__7G10x6y4[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y4[];
extern  VTBL_ENTRY _ZTV7G10x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y4[];
Class_Descriptor cd_G10x6y4 = {  "G10x6y4", // class name
  bases_G10x6y4, 6,
  &(vtc_G10x6y4[0]), // expected_vtbl_contents
  &(vtt_G10x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G10x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y4),5, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y5  : virtual E10x6 , F0 {
  int ff;
  ~G10x6y5(); // tgen
  G10x6y5(); // tgen
};
//SIG(1 G10x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G10x6y5 ::~G10x6y5(){ note_dtor("G10x6y5", this);} // tgen
G10x6y5 ::G10x6y5(){ note_ctor("G10x6y5", this);} // tgen

static void Test_G10x6y5()
{
  extern Class_Descriptor cd_G10x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x6y5, buf);
    G10x6y5 *dp, &lv = *(dp=new (buf) G10x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y5)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(32,24), "G10x6y5");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(36,28), "G10x6y5");
    check_base_class_offset(lv, (C10*)(E10x6*), ABISELECT(16,12), "G10x6y5");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(40,32), "G10x6y5");
    check_base_class_offset(lv, (E10x6*), ABISELECT(16,12), "G10x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x6y5.ff");
    test_class_info(&lv, &cd_G10x6y5);
    dp->~G10x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y5(Test_G10x6y5, "G10x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x6y5C1Ev();
extern void _ZN7G10x6y5D1Ev();
Name_Map name_map_G10x6y5[] = {
  NSPAIR(_ZN7G10x6y5C1Ev),
  NSPAIR(_ZN7G10x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y5[];
static  VTBL_ENTRY vtc_G10x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y5[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x6y5[0]),
};
extern VTBL_ENTRY _ZTV7G10x6y5[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y5[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y5[] = {
  {&(_ZTV7G10x6y5[6]),  6,11},
  {&(_ZTV7G10x6y5[11]),  11,11},
  {&(_tg__ZTV5E10x6__7G10x6y5[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y5[];
extern  VTBL_ENTRY _ZTV7G10x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y5[];
Class_Descriptor cd_G10x6y5 = {  "G10x6y5", // class name
  bases_G10x6y5, 6,
  &(vtc_G10x6y5[0]), // expected_vtbl_contents
  &(vtt_G10x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y5),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y6  : E10x6 , virtual F0 {
  int ff;
  ~G10x6y6(); // tgen
  G10x6y6(); // tgen
};
//SIG(1 G10x6y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x6y6 ::~G10x6y6(){ note_dtor("G10x6y6", this);} // tgen
G10x6y6 ::G10x6y6(){ note_ctor("G10x6y6", this);} // tgen

static void Test_G10x6y6()
{
  extern Class_Descriptor cd_G10x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G10x6y6, buf);
    G10x6y6 *dp, &lv = *(dp=new (buf) G10x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G10x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y6)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(20,16), "G10x6y6");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(24,20), "G10x6y6");
    check_base_class_offset(lv, (C10*)(E10x6*), 0, "G10x6y6");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(28,24), "G10x6y6");
    check_base_class_offset(lv, (E10x6*), 0, "G10x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G10x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x6y6.ff");
    test_class_info(&lv, &cd_G10x6y6);
    dp->~G10x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y6(Test_G10x6y6, "G10x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G10x6y6C1Ev();
extern void _ZN7G10x6y6D1Ev();
Name_Map name_map_G10x6y6[] = {
  NSPAIR(_ZN7G10x6y6C1Ev),
  NSPAIR(_ZN7G10x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y6[];
static  VTBL_ENTRY vtc_G10x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y6[0]),
};
extern VTBL_ENTRY _ZTV7G10x6y6[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y6[] = {
  {&(_ZTV7G10x6y6[6]),  6,6},
  {&(_tg__ZTV5E10x6__7G10x6y6[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y6[];
extern  VTBL_ENTRY _ZTV7G10x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y6[];
Class_Descriptor cd_G10x6y6 = {  "G10x6y6", // class name
  bases_G10x6y6, 6,
  &(vtc_G10x6y6[0]), // expected_vtbl_contents
  &(vtt_G10x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G10x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y6),6, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x6y7  : virtual E10x6 , virtual F0 {
  int ff;
  ~G10x6y7(); // tgen
  G10x6y7(); // tgen
};
//SIG(1 G10x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x6y7 ::~G10x6y7(){ note_dtor("G10x6y7", this);} // tgen
G10x6y7 ::G10x6y7(){ note_ctor("G10x6y7", this);} // tgen

static void Test_G10x6y7()
{
  extern Class_Descriptor cd_G10x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x6y7, buf);
    G10x6y7 *dp, &lv = *(dp=new (buf) G10x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x6y7)");
    check_base_class_offset(lv, (A0*)(C10*)(E10x6*), ABISELECT(32,20), "G10x6y7");
    check_base_class_offset(lv, (B0*)(C10*)(E10x6*), ABISELECT(36,24), "G10x6y7");
    check_base_class_offset(lv, (C10*)(E10x6*), ABISELECT(16,8), "G10x6y7");
    check_base_class_offset(lv, (D0*)(E10x6*), ABISELECT(40,28), "G10x6y7");
    check_base_class_offset(lv, (E10x6*), ABISELECT(16,8), "G10x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G10x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x6y7.ff");
    test_class_info(&lv, &cd_G10x6y7);
    dp->~G10x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x6y7(Test_G10x6y7, "G10x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x6y7C1Ev();
extern void _ZN7G10x6y7D1Ev();
Name_Map name_map_G10x6y7[] = {
  NSPAIR(_ZN7G10x6y7C1Ev),
  NSPAIR(_ZN7G10x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x6;
extern VTBL_ENTRY _ZTI5E10x6[];
extern  VTBL_ENTRY _ZTV5E10x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x6y7[];
static  VTBL_ENTRY vtc_G10x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x6y7[0]),
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x6y7[0]),
};
extern VTBL_ENTRY _ZTV7G10x6y7[];
static  VTBL_ENTRY _tg__ZTV5E10x6__7G10x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C105E10x6__7G10x6y7[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x6y7[] = {
  {&(_ZTV7G10x6y7[7]),  7,12},
  {&(_ZTV7G10x6y7[12]),  12,12},
  {&(_tg__ZTV5E10x6__7G10x6y7[5]),  5,5},
  {&(_tg__ZTV3C105E10x6__7G10x6y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x6y7[];
extern  VTBL_ENTRY _ZTV7G10x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x6y7[];
Class_Descriptor cd_G10x6y7 = {  "G10x6y7", // class name
  bases_G10x6y7, 6,
  &(vtc_G10x6y7[0]), // expected_vtbl_contents
  &(vtt_G10x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x6y7),12, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x6y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E11x6  : C11 , virtual D0 {
  int fd;
  ~E11x6(); // tgen
  E11x6(); // tgen
};
//SIG(-1 E11x6) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E11x6 ::~E11x6(){ note_dtor("E11x6", this);} // tgen
E11x6 ::E11x6(){ note_ctor("E11x6", this);} // tgen

static void Test_E11x6()
{
  extern Class_Descriptor cd_E11x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E11x6, buf);
    E11x6 *dp, &lv = *(dp=new (buf) E11x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E11x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x6)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(16,12), "E11x6");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(28,20), "E11x6");
    check_base_class_offset(lv, (C11*), 0, "E11x6");
    check_base_class_offset(lv, (D0*), ABISELECT(32,24), "E11x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E11x6.fd");
    test_class_info(&lv, &cd_E11x6);
    dp->~E11x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x6(Test_E11x6, "E11x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E11x6C1Ev();
extern void _ZN5E11x6D1Ev();
Name_Map name_map_E11x6[] = {
  NSPAIR(_ZN5E11x6C1Ev),
  NSPAIR(_ZN5E11x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E11x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E11x6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E11x6[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV5E11x6[];
static  VTBL_ENTRY _tg__ZTV3C11__5E11x6[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__5E11x6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x6[] = {
  {&(_ZTV5E11x6[5]),  5,9},
  {&(_tg__ZTV3C11__5E11x6[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__5E11x6[3]),  3,4},
  {&(_ZTV5E11x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
Class_Descriptor cd_E11x6 = {  "E11x6", // class name
  bases_E11x6, 4,
  &(vtc_E11x6[0]), // expected_vtbl_contents
  &(vtt_E11x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E11x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E11x6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E11x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y0  : E11x6 , F1 {
  int ff;
  ~G11x6y0(); // tgen
  G11x6y0(); // tgen
};
//SIG(1 G11x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x6y0 ::~G11x6y0(){ note_dtor("G11x6y0", this);} // tgen
G11x6y0 ::G11x6y0(){ note_ctor("G11x6y0", this);} // tgen

static void Test_G11x6y0()
{
  extern Class_Descriptor cd_G11x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x6y0, buf);
    G11x6y0 *dp, &lv = *(dp=new (buf) G11x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y0)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(32,24), "G11x6y0");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(44,32), "G11x6y0");
    check_base_class_offset(lv, (C11*)(E11x6*), 0, "G11x6y0");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(48,36), "G11x6y0");
    check_base_class_offset(lv, (E11x6*), 0, "G11x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G11x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G11x6y0.ff");
    test_class_info(&lv, &cd_G11x6y0);
    dp->~G11x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y0(Test_G11x6y0, "G11x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x6y0C1Ev();
extern void _ZN7G11x6y0D1Ev();
Name_Map name_map_G11x6y0[] = {
  NSPAIR(_ZN7G11x6y0C1Ev),
  NSPAIR(_ZN7G11x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x6y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y0[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y0[] = {
  {&(_ZTV7G11x6y0[5]),  5,12},
  {&(_tg__ZTV5E11x6__7G11x6y0[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y0[3]),  3,4},
  {&(_ZTV7G11x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G11x6y0[];
extern  VTBL_ENTRY _ZTV7G11x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y0[];
Class_Descriptor cd_G11x6y0 = {  "G11x6y0", // class name
  bases_G11x6y0, 6,
  &(vtc_G11x6y0[0]), // expected_vtbl_contents
  &(vtt_G11x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y0),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y1  : virtual E11x6 , F1 {
  int ff;
  ~G11x6y1(); // tgen
  G11x6y1(); // tgen
};
//SIG(1 G11x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x6y1 ::~G11x6y1(){ note_dtor("G11x6y1", this);} // tgen
G11x6y1 ::G11x6y1(){ note_ctor("G11x6y1", this);} // tgen

static void Test_G11x6y1()
{
  extern Class_Descriptor cd_G11x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x6y1, buf);
    G11x6y1 *dp, &lv = *(dp=new (buf) G11x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y1)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(32,24), "G11x6y1");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(44,32), "G11x6y1");
    check_base_class_offset(lv, (C11*)(E11x6*), ABISELECT(16,12), "G11x6y1");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(48,36), "G11x6y1");
    check_base_class_offset(lv, (E11x6*), ABISELECT(16,12), "G11x6y1");
    check_base_class_offset(lv, (F1*), 0, "G11x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x6y1.ff");
    test_class_info(&lv, &cd_G11x6y1);
    dp->~G11x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y1(Test_G11x6y1, "G11x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x6y1C1Ev();
extern void _ZN7G11x6y1D1Ev();
Name_Map name_map_G11x6y1[] = {
  NSPAIR(_ZN7G11x6y1C1Ev),
  NSPAIR(_ZN7G11x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x6y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x6y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y1[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y1[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y1[] = {
  {&(_ZTV7G11x6y1[6]),  6,16},
  {&(_ZTV7G11x6y1[12]),  12,16},
  {&(_ZTV7G11x6y1[15]),  15,16},
  {&(_tg__ZTV5E11x6__7G11x6y1[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x6y1[];
extern  VTBL_ENTRY _ZTV7G11x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y1[];
Class_Descriptor cd_G11x6y1 = {  "G11x6y1", // class name
  bases_G11x6y1, 6,
  &(vtc_G11x6y1[0]), // expected_vtbl_contents
  &(vtt_G11x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y1),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y2  : E11x6 , virtual F1 {
  int ff;
  ~G11x6y2(); // tgen
  G11x6y2(); // tgen
};
//SIG(1 G11x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x6y2 ::~G11x6y2(){ note_dtor("G11x6y2", this);} // tgen
G11x6y2 ::G11x6y2(){ note_ctor("G11x6y2", this);} // tgen

static void Test_G11x6y2()
{
  extern Class_Descriptor cd_G11x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x6y2, buf);
    G11x6y2 *dp, &lv = *(dp=new (buf) G11x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y2)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(24,16), "G11x6y2");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(36,24), "G11x6y2");
    check_base_class_offset(lv, (C11*)(E11x6*), 0, "G11x6y2");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(40,28), "G11x6y2");
    check_base_class_offset(lv, (E11x6*), 0, "G11x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G11x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x6y2.ff");
    test_class_info(&lv, &cd_G11x6y2);
    dp->~G11x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y2(Test_G11x6y2, "G11x6y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G11x6y2C1Ev();
extern void _ZN7G11x6y2D1Ev();
Name_Map name_map_G11x6y2[] = {
  NSPAIR(_ZN7G11x6y2C1Ev),
  NSPAIR(_ZN7G11x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x6y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G11x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G11x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y2[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y2[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y2[] = {
  {&(_ZTV7G11x6y2[6]),  6,14},
  {&(_tg__ZTV5E11x6__7G11x6y2[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y2[3]),  3,4},
  {&(_ZTV7G11x6y2[9]),  9,14},
  {&(_ZTV7G11x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G11x6y2[];
extern  VTBL_ENTRY _ZTV7G11x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y2[];
Class_Descriptor cd_G11x6y2 = {  "G11x6y2", // class name
  bases_G11x6y2, 6,
  &(vtc_G11x6y2[0]), // expected_vtbl_contents
  &(vtt_G11x6y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G11x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y2),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y3  : virtual E11x6 , virtual F1 {
  int ff;
  ~G11x6y3(); // tgen
  G11x6y3(); // tgen
};
//SIG(1 G11x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x6y3 ::~G11x6y3(){ note_dtor("G11x6y3", this);} // tgen
G11x6y3 ::G11x6y3(){ note_ctor("G11x6y3", this);} // tgen

static void Test_G11x6y3()
{
  extern Class_Descriptor cd_G11x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x6y3, buf);
    G11x6y3 *dp, &lv = *(dp=new (buf) G11x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y3)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(32,20), "G11x6y3");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(44,28), "G11x6y3");
    check_base_class_offset(lv, (C11*)(E11x6*), ABISELECT(16,8), "G11x6y3");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(48,32), "G11x6y3");
    check_base_class_offset(lv, (E11x6*), ABISELECT(16,8), "G11x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x6y3.ff");
    test_class_info(&lv, &cd_G11x6y3);
    dp->~G11x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y3(Test_G11x6y3, "G11x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x6y3C1Ev();
extern void _ZN7G11x6y3D1Ev();
Name_Map name_map_G11x6y3[] = {
  NSPAIR(_ZN7G11x6y3C1Ev),
  NSPAIR(_ZN7G11x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y3[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x6y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G11x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y3[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y3[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y3[] = {
  {&(_ZTV7G11x6y3[7]),  7,20},
  {&(_ZTV7G11x6y3[12]),  12,20},
  {&(_ZTV7G11x6y3[15]),  15,20},
  {&(_ZTV7G11x6y3[19]),  19,20},
  {&(_tg__ZTV5E11x6__7G11x6y3[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x6y3[];
extern  VTBL_ENTRY _ZTV7G11x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y3[];
Class_Descriptor cd_G11x6y3 = {  "G11x6y3", // class name
  bases_G11x6y3, 6,
  &(vtc_G11x6y3[0]), // expected_vtbl_contents
  &(vtt_G11x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y3),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y4  : E11x6 , F0 {
  int ff;
  ~G11x6y4(); // tgen
  G11x6y4(); // tgen
};
//SIG(1 G11x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G11x6y4 ::~G11x6y4(){ note_dtor("G11x6y4", this);} // tgen
G11x6y4 ::G11x6y4(){ note_ctor("G11x6y4", this);} // tgen

static void Test_G11x6y4()
{
  extern Class_Descriptor cd_G11x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x6y4, buf);
    G11x6y4 *dp, &lv = *(dp=new (buf) G11x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y4)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(24,20), "G11x6y4");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(36,28), "G11x6y4");
    check_base_class_offset(lv, (C11*)(E11x6*), 0, "G11x6y4");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(40,32), "G11x6y4");
    check_base_class_offset(lv, (E11x6*), 0, "G11x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G11x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G11x6y4.ff");
    test_class_info(&lv, &cd_G11x6y4);
    dp->~G11x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y4(Test_G11x6y4, "G11x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G11x6y4C1Ev();
extern void _ZN7G11x6y4D1Ev();
Name_Map name_map_G11x6y4[] = {
  NSPAIR(_ZN7G11x6y4C1Ev),
  NSPAIR(_ZN7G11x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x6y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G11x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y4[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y4[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y4[] = {
  {&(_ZTV7G11x6y4[5]),  5,9},
  {&(_tg__ZTV5E11x6__7G11x6y4[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y4[3]),  3,4},
  {&(_ZTV7G11x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G11x6y4[];
extern  VTBL_ENTRY _ZTV7G11x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y4[];
Class_Descriptor cd_G11x6y4 = {  "G11x6y4", // class name
  bases_G11x6y4, 6,
  &(vtc_G11x6y4[0]), // expected_vtbl_contents
  &(vtt_G11x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G11x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y4),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y5  : virtual E11x6 , F0 {
  int ff;
  ~G11x6y5(); // tgen
  G11x6y5(); // tgen
};
//SIG(1 G11x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G11x6y5 ::~G11x6y5(){ note_dtor("G11x6y5", this);} // tgen
G11x6y5 ::G11x6y5(){ note_ctor("G11x6y5", this);} // tgen

static void Test_G11x6y5()
{
  extern Class_Descriptor cd_G11x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x6y5, buf);
    G11x6y5 *dp, &lv = *(dp=new (buf) G11x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y5)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(32,24), "G11x6y5");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(44,32), "G11x6y5");
    check_base_class_offset(lv, (C11*)(E11x6*), ABISELECT(16,12), "G11x6y5");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(48,36), "G11x6y5");
    check_base_class_offset(lv, (E11x6*), ABISELECT(16,12), "G11x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x6y5.ff");
    test_class_info(&lv, &cd_G11x6y5);
    dp->~G11x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y5(Test_G11x6y5, "G11x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x6y5C1Ev();
extern void _ZN7G11x6y5D1Ev();
Name_Map name_map_G11x6y5[] = {
  NSPAIR(_ZN7G11x6y5C1Ev),
  NSPAIR(_ZN7G11x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x6y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y5[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x6y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G11x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y5[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y5[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y5[] = {
  {&(_ZTV7G11x6y5[6]),  6,15},
  {&(_ZTV7G11x6y5[11]),  11,15},
  {&(_ZTV7G11x6y5[14]),  14,15},
  {&(_tg__ZTV5E11x6__7G11x6y5[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x6y5[];
extern  VTBL_ENTRY _ZTV7G11x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y5[];
Class_Descriptor cd_G11x6y5 = {  "G11x6y5", // class name
  bases_G11x6y5, 6,
  &(vtc_G11x6y5[0]), // expected_vtbl_contents
  &(vtt_G11x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y5),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y6  : E11x6 , virtual F0 {
  int ff;
  ~G11x6y6(); // tgen
  G11x6y6(); // tgen
};
//SIG(1 G11x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x6y6 ::~G11x6y6(){ note_dtor("G11x6y6", this);} // tgen
G11x6y6 ::G11x6y6(){ note_ctor("G11x6y6", this);} // tgen

static void Test_G11x6y6()
{
  extern Class_Descriptor cd_G11x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G11x6y6, buf);
    G11x6y6 *dp, &lv = *(dp=new (buf) G11x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G11x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y6)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(24,16), "G11x6y6");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(36,24), "G11x6y6");
    check_base_class_offset(lv, (C11*)(E11x6*), 0, "G11x6y6");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(40,28), "G11x6y6");
    check_base_class_offset(lv, (E11x6*), 0, "G11x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G11x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x6y6.ff");
    test_class_info(&lv, &cd_G11x6y6);
    dp->~G11x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y6(Test_G11x6y6, "G11x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G11x6y6C1Ev();
extern void _ZN7G11x6y6D1Ev();
Name_Map name_map_G11x6y6[] = {
  NSPAIR(_ZN7G11x6y6C1Ev),
  NSPAIR(_ZN7G11x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x6y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G11x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y6[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y6[] = {
  {&(_ZTV7G11x6y6[6]),  6,10},
  {&(_tg__ZTV5E11x6__7G11x6y6[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y6[3]),  3,4},
  {&(_ZTV7G11x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G11x6y6[];
extern  VTBL_ENTRY _ZTV7G11x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y6[];
Class_Descriptor cd_G11x6y6 = {  "G11x6y6", // class name
  bases_G11x6y6, 6,
  &(vtc_G11x6y6[0]), // expected_vtbl_contents
  &(vtt_G11x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G11x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y6),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x6y7  : virtual E11x6 , virtual F0 {
  int ff;
  ~G11x6y7(); // tgen
  G11x6y7(); // tgen
};
//SIG(1 G11x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x6y7 ::~G11x6y7(){ note_dtor("G11x6y7", this);} // tgen
G11x6y7 ::G11x6y7(){ note_ctor("G11x6y7", this);} // tgen

static void Test_G11x6y7()
{
  extern Class_Descriptor cd_G11x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x6y7, buf);
    G11x6y7 *dp, &lv = *(dp=new (buf) G11x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x6y7)");
    check_base_class_offset(lv, (A1*)(C11*)(E11x6*), ABISELECT(32,20), "G11x6y7");
    check_base_class_offset(lv, (B0*)(C11*)(E11x6*), ABISELECT(44,28), "G11x6y7");
    check_base_class_offset(lv, (C11*)(E11x6*), ABISELECT(16,8), "G11x6y7");
    check_base_class_offset(lv, (D0*)(E11x6*), ABISELECT(48,32), "G11x6y7");
    check_base_class_offset(lv, (E11x6*), ABISELECT(16,8), "G11x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G11x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x6y7.ff");
    test_class_info(&lv, &cd_G11x6y7);
    dp->~G11x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x6y7(Test_G11x6y7, "G11x6y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x6y7C1Ev();
extern void _ZN7G11x6y7D1Ev();
Name_Map name_map_G11x6y7[] = {
  NSPAIR(_ZN7G11x6y7C1Ev),
  NSPAIR(_ZN7G11x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x6;
extern VTBL_ENTRY _ZTI5E11x6[];
extern  VTBL_ENTRY _ZTV5E11x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x6y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x6y7[0]),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x6y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x6y7[];
static  VTBL_ENTRY _tg__ZTV5E11x6__7G11x6y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C115E11x6__7G11x6y7[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C115E11x6__7G11x6y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x6__7G11x6y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x6y7[] = {
  {&(_ZTV7G11x6y7[7]),  7,16},
  {&(_ZTV7G11x6y7[12]),  12,16},
  {&(_ZTV7G11x6y7[15]),  15,16},
  {&(_tg__ZTV5E11x6__7G11x6y7[5]),  5,5},
  {&(_tg__ZTV3C115E11x6__7G11x6y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C115E11x6__7G11x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E11x6__7G11x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x6y7[];
extern  VTBL_ENTRY _ZTV7G11x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x6y7[];
Class_Descriptor cd_G11x6y7 = {  "G11x6y7", // class name
  bases_G11x6y7, 6,
  &(vtc_G11x6y7[0]), // expected_vtbl_contents
  &(vtt_G11x6y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x6y7),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E12x6  : C12 , virtual D0 {
  int fd;
  ~E12x6(); // tgen
  E12x6(); // tgen
};
//SIG(-1 E12x6) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E12x6 ::~E12x6(){ note_dtor("E12x6", this);} // tgen
E12x6 ::E12x6(){ note_ctor("E12x6", this);} // tgen

static void Test_E12x6()
{
  extern Class_Descriptor cd_E12x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E12x6, buf);
    E12x6 *dp, &lv = *(dp=new (buf) E12x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E12x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x6)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(8,4), "E12x6");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(24,16), "E12x6");
    check_base_class_offset(lv, (C12*), 0, "E12x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E12x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E12x6.fd");
    test_class_info(&lv, &cd_E12x6);
    dp->~E12x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x6(Test_E12x6, "E12x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E12x6C1Ev();
extern void _ZN5E12x6D1Ev();
Name_Map name_map_E12x6[] = {
  NSPAIR(_ZN5E12x6C1Ev),
  NSPAIR(_ZN5E12x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E12x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E12x6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E12x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E12x6[];
static  VTBL_ENTRY _tg__ZTV3C12__5E12x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__5E12x6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x6[] = {
  {&(_ZTV5E12x6[4]),  4,8},
  {&(_tg__ZTV3C12__5E12x6[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__5E12x6[3]),  3,4},
  {&(_ZTV5E12x6[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
Class_Descriptor cd_E12x6 = {  "E12x6", // class name
  bases_E12x6, 4,
  &(vtc_E12x6[0]), // expected_vtbl_contents
  &(vtt_E12x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E12x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E12x6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E12x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y0  : E12x6 , F1 {
  int ff;
  ~G12x6y0(); // tgen
  G12x6y0(); // tgen
};
//SIG(1 G12x6y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x6y0 ::~G12x6y0(){ note_dtor("G12x6y0", this);} // tgen
G12x6y0 ::G12x6y0(){ note_ctor("G12x6y0", this);} // tgen

static void Test_G12x6y0()
{
  extern Class_Descriptor cd_G12x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x6y0, buf);
    G12x6y0 *dp, &lv = *(dp=new (buf) G12x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y0)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(8,4), "G12x6y0");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(40,28), "G12x6y0");
    check_base_class_offset(lv, (C12*)(E12x6*), 0, "G12x6y0");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(52,36), "G12x6y0");
    check_base_class_offset(lv, (E12x6*), 0, "G12x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G12x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G12x6y0.ff");
    test_class_info(&lv, &cd_G12x6y0);
    dp->~G12x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y0(Test_G12x6y0, "G12x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x6y0C1Ev();
extern void _ZN7G12x6y0D1Ev();
Name_Map name_map_G12x6y0[] = {
  NSPAIR(_ZN7G12x6y0C1Ev),
  NSPAIR(_ZN7G12x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y0[0]),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G12x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y0[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y0[] = {
  {&(_ZTV7G12x6y0[4]),  4,11},
  {&(_tg__ZTV5E12x6__7G12x6y0[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y0[3]),  3,4},
  {&(_ZTV7G12x6y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G12x6y0[];
extern  VTBL_ENTRY _ZTV7G12x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y0[];
Class_Descriptor cd_G12x6y0 = {  "G12x6y0", // class name
  bases_G12x6y0, 6,
  &(vtc_G12x6y0[0]), // expected_vtbl_contents
  &(vtt_G12x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y1  : virtual E12x6 , F1 {
  int ff;
  ~G12x6y1(); // tgen
  G12x6y1(); // tgen
};
//SIG(1 G12x6y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x6y1 ::~G12x6y1(){ note_dtor("G12x6y1", this);} // tgen
G12x6y1 ::G12x6y1(){ note_ctor("G12x6y1", this);} // tgen

static void Test_G12x6y1()
{
  extern Class_Descriptor cd_G12x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x6y1, buf);
    G12x6y1 *dp, &lv = *(dp=new (buf) G12x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y1)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(24,16), "G12x6y1");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(40,28), "G12x6y1");
    check_base_class_offset(lv, (C12*)(E12x6*), ABISELECT(16,12), "G12x6y1");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(52,36), "G12x6y1");
    check_base_class_offset(lv, (E12x6*), ABISELECT(16,12), "G12x6y1");
    check_base_class_offset(lv, (F1*), 0, "G12x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x6y1.ff");
    test_class_info(&lv, &cd_G12x6y1);
    dp->~G12x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y1(Test_G12x6y1, "G12x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x6y1C1Ev();
extern void _ZN7G12x6y1D1Ev();
Name_Map name_map_G12x6y1[] = {
  NSPAIR(_ZN7G12x6y1C1Ev),
  NSPAIR(_ZN7G12x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x6y1[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y1[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y1[] = {
  {&(_ZTV7G12x6y1[5]),  5,14},
  {&(_ZTV7G12x6y1[10]),  10,14},
  {&(_ZTV7G12x6y1[13]),  13,14},
  {&(_tg__ZTV5E12x6__7G12x6y1[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x6y1[];
extern  VTBL_ENTRY _ZTV7G12x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y1[];
Class_Descriptor cd_G12x6y1 = {  "G12x6y1", // class name
  bases_G12x6y1, 6,
  &(vtc_G12x6y1[0]), // expected_vtbl_contents
  &(vtt_G12x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y2  : E12x6 , virtual F1 {
  int ff;
  ~G12x6y2(); // tgen
  G12x6y2(); // tgen
};
//SIG(1 G12x6y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x6y2 ::~G12x6y2(){ note_dtor("G12x6y2", this);} // tgen
G12x6y2 ::G12x6y2(){ note_ctor("G12x6y2", this);} // tgen

static void Test_G12x6y2()
{
  extern Class_Descriptor cd_G12x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x6y2, buf);
    G12x6y2 *dp, &lv = *(dp=new (buf) G12x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y2)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(8,4), "G12x6y2");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(24,20), "G12x6y2");
    check_base_class_offset(lv, (C12*)(E12x6*), 0, "G12x6y2");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(36,28), "G12x6y2");
    check_base_class_offset(lv, (E12x6*), 0, "G12x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G12x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G12x6y2.ff");
    test_class_info(&lv, &cd_G12x6y2);
    dp->~G12x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y2(Test_G12x6y2, "G12x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x6y2C1Ev();
extern void _ZN7G12x6y2D1Ev();
Name_Map name_map_G12x6y2[] = {
  NSPAIR(_ZN7G12x6y2C1Ev),
  NSPAIR(_ZN7G12x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y2[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G12x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G12x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y2[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y2[] = {
  {&(_ZTV7G12x6y2[5]),  5,13},
  {&(_tg__ZTV5E12x6__7G12x6y2[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y2[3]),  3,4},
  {&(_ZTV7G12x6y2[8]),  8,13},
  {&(_ZTV7G12x6y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G12x6y2[];
extern  VTBL_ENTRY _ZTV7G12x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y2[];
Class_Descriptor cd_G12x6y2 = {  "G12x6y2", // class name
  bases_G12x6y2, 6,
  &(vtc_G12x6y2[0]), // expected_vtbl_contents
  &(vtt_G12x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y3  : virtual E12x6 , virtual F1 {
  int ff;
  ~G12x6y3(); // tgen
  G12x6y3(); // tgen
};
//SIG(1 G12x6y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x6y3 ::~G12x6y3(){ note_dtor("G12x6y3", this);} // tgen
G12x6y3 ::G12x6y3(){ note_ctor("G12x6y3", this);} // tgen

static void Test_G12x6y3()
{
  extern Class_Descriptor cd_G12x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x6y3, buf);
    G12x6y3 *dp, &lv = *(dp=new (buf) G12x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y3)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(24,12), "G12x6y3");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(40,24), "G12x6y3");
    check_base_class_offset(lv, (C12*)(E12x6*), ABISELECT(16,8), "G12x6y3");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(52,32), "G12x6y3");
    check_base_class_offset(lv, (E12x6*), ABISELECT(16,8), "G12x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G12x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x6y3.ff");
    test_class_info(&lv, &cd_G12x6y3);
    dp->~G12x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y3(Test_G12x6y3, "G12x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G12x6y3C1Ev();
extern void _ZN7G12x6y3D1Ev();
Name_Map name_map_G12x6y3[] = {
  NSPAIR(_ZN7G12x6y3C1Ev),
  NSPAIR(_ZN7G12x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y3[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x6y3[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G12x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G12x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y3[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y3[] = {
  {&(_ZTV7G12x6y3[6]),  6,18},
  {&(_ZTV7G12x6y3[10]),  10,18},
  {&(_ZTV7G12x6y3[13]),  13,18},
  {&(_ZTV7G12x6y3[17]),  17,18},
  {&(_tg__ZTV5E12x6__7G12x6y3[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x6y3[];
extern  VTBL_ENTRY _ZTV7G12x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y3[];
Class_Descriptor cd_G12x6y3 = {  "G12x6y3", // class name
  bases_G12x6y3, 6,
  &(vtc_G12x6y3[0]), // expected_vtbl_contents
  &(vtt_G12x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G12x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y4  : E12x6 , F0 {
  int ff;
  ~G12x6y4(); // tgen
  G12x6y4(); // tgen
};
//SIG(1 G12x6y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G12x6y4 ::~G12x6y4(){ note_dtor("G12x6y4", this);} // tgen
G12x6y4 ::G12x6y4(){ note_ctor("G12x6y4", this);} // tgen

static void Test_G12x6y4()
{
  extern Class_Descriptor cd_G12x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x6y4, buf);
    G12x6y4 *dp, &lv = *(dp=new (buf) G12x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y4)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(8,4), "G12x6y4");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(32,24), "G12x6y4");
    check_base_class_offset(lv, (C12*)(E12x6*), 0, "G12x6y4");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(44,32), "G12x6y4");
    check_base_class_offset(lv, (E12x6*), 0, "G12x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G12x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G12x6y4.ff");
    test_class_info(&lv, &cd_G12x6y4);
    dp->~G12x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y4(Test_G12x6y4, "G12x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G12x6y4C1Ev();
extern void _ZN7G12x6y4D1Ev();
Name_Map name_map_G12x6y4[] = {
  NSPAIR(_ZN7G12x6y4C1Ev),
  NSPAIR(_ZN7G12x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y4[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y4[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y4[] = {
  {&(_ZTV7G12x6y4[4]),  4,8},
  {&(_tg__ZTV5E12x6__7G12x6y4[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y4[3]),  3,4},
  {&(_ZTV7G12x6y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G12x6y4[];
extern  VTBL_ENTRY _ZTV7G12x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y4[];
Class_Descriptor cd_G12x6y4 = {  "G12x6y4", // class name
  bases_G12x6y4, 6,
  &(vtc_G12x6y4[0]), // expected_vtbl_contents
  &(vtt_G12x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G12x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y5  : virtual E12x6 , F0 {
  int ff;
  ~G12x6y5(); // tgen
  G12x6y5(); // tgen
};
//SIG(1 G12x6y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G12x6y5 ::~G12x6y5(){ note_dtor("G12x6y5", this);} // tgen
G12x6y5 ::G12x6y5(){ note_ctor("G12x6y5", this);} // tgen

static void Test_G12x6y5()
{
  extern Class_Descriptor cd_G12x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x6y5, buf);
    G12x6y5 *dp, &lv = *(dp=new (buf) G12x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y5)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(24,16), "G12x6y5");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(40,28), "G12x6y5");
    check_base_class_offset(lv, (C12*)(E12x6*), ABISELECT(16,12), "G12x6y5");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(52,36), "G12x6y5");
    check_base_class_offset(lv, (E12x6*), ABISELECT(16,12), "G12x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x6y5.ff");
    test_class_info(&lv, &cd_G12x6y5);
    dp->~G12x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y5(Test_G12x6y5, "G12x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x6y5C1Ev();
extern void _ZN7G12x6y5D1Ev();
Name_Map name_map_G12x6y5[] = {
  NSPAIR(_ZN7G12x6y5C1Ev),
  NSPAIR(_ZN7G12x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y5[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x6y5[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y5[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y5[] = {
  {&(_ZTV7G12x6y5[5]),  5,13},
  {&(_ZTV7G12x6y5[9]),  9,13},
  {&(_ZTV7G12x6y5[12]),  12,13},
  {&(_tg__ZTV5E12x6__7G12x6y5[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x6y5[];
extern  VTBL_ENTRY _ZTV7G12x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y5[];
Class_Descriptor cd_G12x6y5 = {  "G12x6y5", // class name
  bases_G12x6y5, 6,
  &(vtc_G12x6y5[0]), // expected_vtbl_contents
  &(vtt_G12x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y6  : E12x6 , virtual F0 {
  int ff;
  ~G12x6y6(); // tgen
  G12x6y6(); // tgen
};
//SIG(1 G12x6y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x6y6 ::~G12x6y6(){ note_dtor("G12x6y6", this);} // tgen
G12x6y6 ::G12x6y6(){ note_ctor("G12x6y6", this);} // tgen

static void Test_G12x6y6()
{
  extern Class_Descriptor cd_G12x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G12x6y6, buf);
    G12x6y6 *dp, &lv = *(dp=new (buf) G12x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G12x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y6)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(8,4), "G12x6y6");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(24,20), "G12x6y6");
    check_base_class_offset(lv, (C12*)(E12x6*), 0, "G12x6y6");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(36,28), "G12x6y6");
    check_base_class_offset(lv, (E12x6*), 0, "G12x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G12x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G12x6y6.ff");
    test_class_info(&lv, &cd_G12x6y6);
    dp->~G12x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y6(Test_G12x6y6, "G12x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G12x6y6C1Ev();
extern void _ZN7G12x6y6D1Ev();
Name_Map name_map_G12x6y6[] = {
  NSPAIR(_ZN7G12x6y6C1Ev),
  NSPAIR(_ZN7G12x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y6[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G12x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y6[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y6[] = {
  {&(_ZTV7G12x6y6[5]),  5,9},
  {&(_tg__ZTV5E12x6__7G12x6y6[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y6[3]),  3,4},
  {&(_ZTV7G12x6y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G12x6y6[];
extern  VTBL_ENTRY _ZTV7G12x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y6[];
Class_Descriptor cd_G12x6y6 = {  "G12x6y6", // class name
  bases_G12x6y6, 6,
  &(vtc_G12x6y6[0]), // expected_vtbl_contents
  &(vtt_G12x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G12x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x6y7  : virtual E12x6 , virtual F0 {
  int ff;
  ~G12x6y7(); // tgen
  G12x6y7(); // tgen
};
//SIG(1 G12x6y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x6y7 ::~G12x6y7(){ note_dtor("G12x6y7", this);} // tgen
G12x6y7 ::G12x6y7(){ note_ctor("G12x6y7", this);} // tgen

static void Test_G12x6y7()
{
  extern Class_Descriptor cd_G12x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G12x6y7, buf);
    G12x6y7 *dp, &lv = *(dp=new (buf) G12x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G12x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x6y7)");
    check_base_class_offset(lv, (A0*)(C12*)(E12x6*), ABISELECT(24,12), "G12x6y7");
    check_base_class_offset(lv, (B1*)(C12*)(E12x6*), ABISELECT(40,24), "G12x6y7");
    check_base_class_offset(lv, (C12*)(E12x6*), ABISELECT(16,8), "G12x6y7");
    check_base_class_offset(lv, (D0*)(E12x6*), ABISELECT(52,32), "G12x6y7");
    check_base_class_offset(lv, (E12x6*), ABISELECT(16,8), "G12x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G12x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x6y7.ff");
    test_class_info(&lv, &cd_G12x6y7);
    dp->~G12x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x6y7(Test_G12x6y7, "G12x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G12x6y7C1Ev();
extern void _ZN7G12x6y7D1Ev();
Name_Map name_map_G12x6y7[] = {
  NSPAIR(_ZN7G12x6y7C1Ev),
  NSPAIR(_ZN7G12x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x6;
extern VTBL_ENTRY _ZTI5E12x6[];
extern  VTBL_ENTRY _ZTV5E12x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x6y7[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x6y7[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G12x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x6y7[];
static  VTBL_ENTRY _tg__ZTV5E12x6__7G12x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C125E12x6__7G12x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C125E12x6__7G12x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x6__7G12x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x6y7[] = {
  {&(_ZTV7G12x6y7[6]),  6,14},
  {&(_ZTV7G12x6y7[10]),  10,14},
  {&(_ZTV7G12x6y7[13]),  13,14},
  {&(_tg__ZTV5E12x6__7G12x6y7[4]),  4,4},
  {&(_tg__ZTV3C125E12x6__7G12x6y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C125E12x6__7G12x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E12x6__7G12x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x6y7[];
extern  VTBL_ENTRY _ZTV7G12x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x6y7[];
Class_Descriptor cd_G12x6y7 = {  "G12x6y7", // class name
  bases_G12x6y7, 6,
  &(vtc_G12x6y7[0]), // expected_vtbl_contents
  &(vtt_G12x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G12x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x6y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x6  : C13 , virtual D0 {
  int fd;
  ~E13x6(); // tgen
  E13x6(); // tgen
};
//SIG(-1 E13x6) C1{ BC2{ BC3{ v1 Fi} VBC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E13x6 ::~E13x6(){ note_dtor("E13x6", this);} // tgen
E13x6 ::E13x6(){ note_ctor("E13x6", this);} // tgen

static void Test_E13x6()
{
  extern Class_Descriptor cd_E13x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E13x6, buf);
    E13x6 *dp, &lv = *(dp=new (buf) E13x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E13x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x6)");
    check_base_class_offset(lv, (A1*)(C13*), 0, "E13x6");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(24,16), "E13x6");
    check_base_class_offset(lv, (C13*), 0, "E13x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E13x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E13x6.fd");
    test_class_info(&lv, &cd_E13x6);
    dp->~E13x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x6(Test_E13x6, "E13x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E13x6C1Ev();
extern void _ZN5E13x6D1Ev();
Name_Map name_map_E13x6[] = {
  NSPAIR(_ZN5E13x6C1Ev),
  NSPAIR(_ZN5E13x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E13x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E13x6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E13x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E13x6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__5E13x6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x6[] = {
  {&(_ZTV5E13x6[4]),  4,9},
  {&(_tg__ZTV3C13__5E13x6[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__5E13x6[3]),  3,4},
  {&(_ZTV5E13x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
Class_Descriptor cd_E13x6 = {  "E13x6", // class name
  bases_E13x6, 4,
  &(vtc_E13x6[0]), // expected_vtbl_contents
  &(vtt_E13x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E13x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E13x6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E13x6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y0  : E13x6 , F1 {
  int ff;
  ~G13x6y0(); // tgen
  G13x6y0(); // tgen
};
//SIG(1 G13x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x6y0 ::~G13x6y0(){ note_dtor("G13x6y0", this);} // tgen
G13x6y0 ::G13x6y0(){ note_ctor("G13x6y0", this);} // tgen

static void Test_G13x6y0()
{
  extern Class_Descriptor cd_G13x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x6y0, buf);
    G13x6y0 *dp, &lv = *(dp=new (buf) G13x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y0)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), 0, "G13x6y0");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(40,28), "G13x6y0");
    check_base_class_offset(lv, (C13*)(E13x6*), 0, "G13x6y0");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(52,36), "G13x6y0");
    check_base_class_offset(lv, (E13x6*), 0, "G13x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G13x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G13x6y0.ff");
    test_class_info(&lv, &cd_G13x6y0);
    dp->~G13x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y0(Test_G13x6y0, "G13x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x6y0C1Ev();
extern void _ZN7G13x6y0D1Ev();
Name_Map name_map_G13x6y0[] = {
  NSPAIR(_ZN7G13x6y0C1Ev),
  NSPAIR(_ZN7G13x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y0[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G13x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y0[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y0[] = {
  {&(_ZTV7G13x6y0[4]),  4,12},
  {&(_tg__ZTV5E13x6__7G13x6y0[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y0[3]),  3,4},
  {&(_ZTV7G13x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G13x6y0[];
extern  VTBL_ENTRY _ZTV7G13x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y0[];
Class_Descriptor cd_G13x6y0 = {  "G13x6y0", // class name
  bases_G13x6y0, 6,
  &(vtc_G13x6y0[0]), // expected_vtbl_contents
  &(vtt_G13x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y1  : virtual E13x6 , F1 {
  int ff;
  ~G13x6y1(); // tgen
  G13x6y1(); // tgen
};
//SIG(1 G13x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x6y1 ::~G13x6y1(){ note_dtor("G13x6y1", this);} // tgen
G13x6y1 ::G13x6y1(){ note_ctor("G13x6y1", this);} // tgen

static void Test_G13x6y1()
{
  extern Class_Descriptor cd_G13x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x6y1, buf);
    G13x6y1 *dp, &lv = *(dp=new (buf) G13x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y1)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), ABISELECT(16,12), "G13x6y1");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(40,28), "G13x6y1");
    check_base_class_offset(lv, (C13*)(E13x6*), ABISELECT(16,12), "G13x6y1");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(52,36), "G13x6y1");
    check_base_class_offset(lv, (E13x6*), ABISELECT(16,12), "G13x6y1");
    check_base_class_offset(lv, (F1*), 0, "G13x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x6y1.ff");
    test_class_info(&lv, &cd_G13x6y1);
    dp->~G13x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y1(Test_G13x6y1, "G13x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x6y1C1Ev();
extern void _ZN7G13x6y1D1Ev();
Name_Map name_map_G13x6y1[] = {
  NSPAIR(_ZN7G13x6y1C1Ev),
  NSPAIR(_ZN7G13x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y1[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y1[] = {
  {&(_ZTV7G13x6y1[5]),  5,16},
  {&(_ZTV7G13x6y1[11]),  11,16},
  {&(_ZTV7G13x6y1[15]),  15,16},
  {&(_tg__ZTV5E13x6__7G13x6y1[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x6y1[];
extern  VTBL_ENTRY _ZTV7G13x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y1[];
Class_Descriptor cd_G13x6y1 = {  "G13x6y1", // class name
  bases_G13x6y1, 6,
  &(vtc_G13x6y1[0]), // expected_vtbl_contents
  &(vtt_G13x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y2  : E13x6 , virtual F1 {
  int ff;
  ~G13x6y2(); // tgen
  G13x6y2(); // tgen
};
//SIG(1 G13x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x6y2 ::~G13x6y2(){ note_dtor("G13x6y2", this);} // tgen
G13x6y2 ::G13x6y2(){ note_ctor("G13x6y2", this);} // tgen

static void Test_G13x6y2()
{
  extern Class_Descriptor cd_G13x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x6y2, buf);
    G13x6y2 *dp, &lv = *(dp=new (buf) G13x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y2)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), 0, "G13x6y2");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(24,20), "G13x6y2");
    check_base_class_offset(lv, (C13*)(E13x6*), 0, "G13x6y2");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(36,28), "G13x6y2");
    check_base_class_offset(lv, (E13x6*), 0, "G13x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G13x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G13x6y2.ff");
    test_class_info(&lv, &cd_G13x6y2);
    dp->~G13x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y2(Test_G13x6y2, "G13x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x6y2C1Ev();
extern void _ZN7G13x6y2D1Ev();
Name_Map name_map_G13x6y2[] = {
  NSPAIR(_ZN7G13x6y2C1Ev),
  NSPAIR(_ZN7G13x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G13x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G13x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y2[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y2[] = {
  {&(_ZTV7G13x6y2[5]),  5,14},
  {&(_tg__ZTV5E13x6__7G13x6y2[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y2[3]),  3,4},
  {&(_ZTV7G13x6y2[9]),  9,14},
  {&(_ZTV7G13x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G13x6y2[];
extern  VTBL_ENTRY _ZTV7G13x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y2[];
Class_Descriptor cd_G13x6y2 = {  "G13x6y2", // class name
  bases_G13x6y2, 6,
  &(vtc_G13x6y2[0]), // expected_vtbl_contents
  &(vtt_G13x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y3  : virtual E13x6 , virtual F1 {
  int ff;
  ~G13x6y3(); // tgen
  G13x6y3(); // tgen
};
//SIG(1 G13x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x6y3 ::~G13x6y3(){ note_dtor("G13x6y3", this);} // tgen
G13x6y3 ::G13x6y3(){ note_ctor("G13x6y3", this);} // tgen

static void Test_G13x6y3()
{
  extern Class_Descriptor cd_G13x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x6y3, buf);
    G13x6y3 *dp, &lv = *(dp=new (buf) G13x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y3)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), ABISELECT(16,8), "G13x6y3");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(40,24), "G13x6y3");
    check_base_class_offset(lv, (C13*)(E13x6*), ABISELECT(16,8), "G13x6y3");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(52,32), "G13x6y3");
    check_base_class_offset(lv, (E13x6*), ABISELECT(16,8), "G13x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G13x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x6y3.ff");
    test_class_info(&lv, &cd_G13x6y3);
    dp->~G13x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y3(Test_G13x6y3, "G13x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G13x6y3C1Ev();
extern void _ZN7G13x6y3D1Ev();
Name_Map name_map_G13x6y3[] = {
  NSPAIR(_ZN7G13x6y3C1Ev),
  NSPAIR(_ZN7G13x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G13x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G13x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y3[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y3[] = {
  {&(_ZTV7G13x6y3[6]),  6,20},
  {&(_ZTV7G13x6y3[11]),  11,20},
  {&(_ZTV7G13x6y3[15]),  15,20},
  {&(_ZTV7G13x6y3[19]),  19,20},
  {&(_tg__ZTV5E13x6__7G13x6y3[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x6y3[];
extern  VTBL_ENTRY _ZTV7G13x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y3[];
Class_Descriptor cd_G13x6y3 = {  "G13x6y3", // class name
  bases_G13x6y3, 6,
  &(vtc_G13x6y3[0]), // expected_vtbl_contents
  &(vtt_G13x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G13x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y4  : E13x6 , F0 {
  int ff;
  ~G13x6y4(); // tgen
  G13x6y4(); // tgen
};
//SIG(1 G13x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G13x6y4 ::~G13x6y4(){ note_dtor("G13x6y4", this);} // tgen
G13x6y4 ::G13x6y4(){ note_ctor("G13x6y4", this);} // tgen

static void Test_G13x6y4()
{
  extern Class_Descriptor cd_G13x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x6y4, buf);
    G13x6y4 *dp, &lv = *(dp=new (buf) G13x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y4)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), 0, "G13x6y4");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(32,24), "G13x6y4");
    check_base_class_offset(lv, (C13*)(E13x6*), 0, "G13x6y4");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(44,32), "G13x6y4");
    check_base_class_offset(lv, (E13x6*), 0, "G13x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G13x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G13x6y4.ff");
    test_class_info(&lv, &cd_G13x6y4);
    dp->~G13x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y4(Test_G13x6y4, "G13x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G13x6y4C1Ev();
extern void _ZN7G13x6y4D1Ev();
Name_Map name_map_G13x6y4[] = {
  NSPAIR(_ZN7G13x6y4C1Ev),
  NSPAIR(_ZN7G13x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y4[] = {
  {&(_ZTV7G13x6y4[4]),  4,9},
  {&(_tg__ZTV5E13x6__7G13x6y4[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y4[3]),  3,4},
  {&(_ZTV7G13x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G13x6y4[];
extern  VTBL_ENTRY _ZTV7G13x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y4[];
Class_Descriptor cd_G13x6y4 = {  "G13x6y4", // class name
  bases_G13x6y4, 6,
  &(vtc_G13x6y4[0]), // expected_vtbl_contents
  &(vtt_G13x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G13x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y5  : virtual E13x6 , F0 {
  int ff;
  ~G13x6y5(); // tgen
  G13x6y5(); // tgen
};
//SIG(1 G13x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G13x6y5 ::~G13x6y5(){ note_dtor("G13x6y5", this);} // tgen
G13x6y5 ::G13x6y5(){ note_ctor("G13x6y5", this);} // tgen

static void Test_G13x6y5()
{
  extern Class_Descriptor cd_G13x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x6y5, buf);
    G13x6y5 *dp, &lv = *(dp=new (buf) G13x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y5)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), ABISELECT(16,12), "G13x6y5");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(40,28), "G13x6y5");
    check_base_class_offset(lv, (C13*)(E13x6*), ABISELECT(16,12), "G13x6y5");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(52,36), "G13x6y5");
    check_base_class_offset(lv, (E13x6*), ABISELECT(16,12), "G13x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x6y5.ff");
    test_class_info(&lv, &cd_G13x6y5);
    dp->~G13x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y5(Test_G13x6y5, "G13x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x6y5C1Ev();
extern void _ZN7G13x6y5D1Ev();
Name_Map name_map_G13x6y5[] = {
  NSPAIR(_ZN7G13x6y5C1Ev),
  NSPAIR(_ZN7G13x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y5[] = {
  {&(_ZTV7G13x6y5[5]),  5,15},
  {&(_ZTV7G13x6y5[10]),  10,15},
  {&(_ZTV7G13x6y5[14]),  14,15},
  {&(_tg__ZTV5E13x6__7G13x6y5[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x6y5[];
extern  VTBL_ENTRY _ZTV7G13x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y5[];
Class_Descriptor cd_G13x6y5 = {  "G13x6y5", // class name
  bases_G13x6y5, 6,
  &(vtc_G13x6y5[0]), // expected_vtbl_contents
  &(vtt_G13x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y6  : E13x6 , virtual F0 {
  int ff;
  ~G13x6y6(); // tgen
  G13x6y6(); // tgen
};
//SIG(1 G13x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x6y6 ::~G13x6y6(){ note_dtor("G13x6y6", this);} // tgen
G13x6y6 ::G13x6y6(){ note_ctor("G13x6y6", this);} // tgen

static void Test_G13x6y6()
{
  extern Class_Descriptor cd_G13x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G13x6y6, buf);
    G13x6y6 *dp, &lv = *(dp=new (buf) G13x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G13x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y6)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), 0, "G13x6y6");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(24,20), "G13x6y6");
    check_base_class_offset(lv, (C13*)(E13x6*), 0, "G13x6y6");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(36,28), "G13x6y6");
    check_base_class_offset(lv, (E13x6*), 0, "G13x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G13x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G13x6y6.ff");
    test_class_info(&lv, &cd_G13x6y6);
    dp->~G13x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y6(Test_G13x6y6, "G13x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G13x6y6C1Ev();
extern void _ZN7G13x6y6D1Ev();
Name_Map name_map_G13x6y6[] = {
  NSPAIR(_ZN7G13x6y6C1Ev),
  NSPAIR(_ZN7G13x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G13x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y6[] = {
  {&(_ZTV7G13x6y6[5]),  5,10},
  {&(_tg__ZTV5E13x6__7G13x6y6[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y6[3]),  3,4},
  {&(_ZTV7G13x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G13x6y6[];
extern  VTBL_ENTRY _ZTV7G13x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y6[];
Class_Descriptor cd_G13x6y6 = {  "G13x6y6", // class name
  bases_G13x6y6, 6,
  &(vtc_G13x6y6[0]), // expected_vtbl_contents
  &(vtt_G13x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G13x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x6y7  : virtual E13x6 , virtual F0 {
  int ff;
  ~G13x6y7(); // tgen
  G13x6y7(); // tgen
};
//SIG(1 G13x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x6y7 ::~G13x6y7(){ note_dtor("G13x6y7", this);} // tgen
G13x6y7 ::G13x6y7(){ note_ctor("G13x6y7", this);} // tgen

static void Test_G13x6y7()
{
  extern Class_Descriptor cd_G13x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G13x6y7, buf);
    G13x6y7 *dp, &lv = *(dp=new (buf) G13x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G13x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x6y7)");
    check_base_class_offset(lv, (A1*)(C13*)(E13x6*), ABISELECT(16,8), "G13x6y7");
    check_base_class_offset(lv, (B1*)(C13*)(E13x6*), ABISELECT(40,24), "G13x6y7");
    check_base_class_offset(lv, (C13*)(E13x6*), ABISELECT(16,8), "G13x6y7");
    check_base_class_offset(lv, (D0*)(E13x6*), ABISELECT(52,32), "G13x6y7");
    check_base_class_offset(lv, (E13x6*), ABISELECT(16,8), "G13x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G13x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x6y7.ff");
    test_class_info(&lv, &cd_G13x6y7);
    dp->~G13x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x6y7(Test_G13x6y7, "G13x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G13x6y7C1Ev();
extern void _ZN7G13x6y7D1Ev();
Name_Map name_map_G13x6y7[] = {
  NSPAIR(_ZN7G13x6y7C1Ev),
  NSPAIR(_ZN7G13x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x6;
extern VTBL_ENTRY _ZTI5E13x6[];
extern  VTBL_ENTRY _ZTV5E13x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x6y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G13x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x6y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV5E13x6__7G13x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C135E13x6__7G13x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C135E13x6__7G13x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x6__7G13x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x6y7[] = {
  {&(_ZTV7G13x6y7[6]),  6,16},
  {&(_ZTV7G13x6y7[11]),  11,16},
  {&(_ZTV7G13x6y7[15]),  15,16},
  {&(_tg__ZTV5E13x6__7G13x6y7[4]),  4,5},
  {&(_tg__ZTV3C135E13x6__7G13x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C135E13x6__7G13x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E13x6__7G13x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x6y7[];
extern  VTBL_ENTRY _ZTV7G13x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x6y7[];
Class_Descriptor cd_G13x6y7 = {  "G13x6y7", // class name
  bases_G13x6y7, 6,
  &(vtc_G13x6y7[0]), // expected_vtbl_contents
  &(vtt_G13x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G13x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x6y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x6y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x6  : C14 , virtual D0 {
  int fd;
  ~E14x6(); // tgen
  E14x6(); // tgen
};
//SIG(-1 E14x6) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E14x6 ::~E14x6(){ note_dtor("E14x6", this);} // tgen
E14x6 ::E14x6(){ note_ctor("E14x6", this);} // tgen

static void Test_E14x6()
{
  extern Class_Descriptor cd_E14x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E14x6, buf);
    E14x6 *dp, &lv = *(dp=new (buf) E14x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E14x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x6)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(16,12), "E14x6");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(24,16), "E14x6");
    check_base_class_offset(lv, (C14*), 0, "E14x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E14x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E14x6.fd");
    test_class_info(&lv, &cd_E14x6);
    dp->~E14x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x6(Test_E14x6, "E14x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E14x6C1Ev();
extern void _ZN5E14x6D1Ev();
Name_Map name_map_E14x6[] = {
  NSPAIR(_ZN5E14x6C1Ev),
  NSPAIR(_ZN5E14x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E14x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E14x6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E14x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E14x6[];
static  VTBL_ENTRY _tg__ZTV3C14__5E14x6[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__5E14x6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x6[] = {
  {&(_ZTV5E14x6[5]),  5,9},
  {&(_tg__ZTV3C14__5E14x6[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__5E14x6[3]),  3,4},
  {&(_ZTV5E14x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
Class_Descriptor cd_E14x6 = {  "E14x6", // class name
  bases_E14x6, 4,
  &(vtc_E14x6[0]), // expected_vtbl_contents
  &(vtt_E14x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E14x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E14x6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E14x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y0  : E14x6 , F1 {
  int ff;
  ~G14x6y0(); // tgen
  G14x6y0(); // tgen
};
//SIG(1 G14x6y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x6y0 ::~G14x6y0(){ note_dtor("G14x6y0", this);} // tgen
G14x6y0 ::G14x6y0(){ note_ctor("G14x6y0", this);} // tgen

static void Test_G14x6y0()
{
  extern Class_Descriptor cd_G14x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x6y0, buf);
    G14x6y0 *dp, &lv = *(dp=new (buf) G14x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y0)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(32,24), "G14x6y0");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(40,28), "G14x6y0");
    check_base_class_offset(lv, (C14*)(E14x6*), 0, "G14x6y0");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(52,36), "G14x6y0");
    check_base_class_offset(lv, (E14x6*), 0, "G14x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G14x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G14x6y0.ff");
    test_class_info(&lv, &cd_G14x6y0);
    dp->~G14x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y0(Test_G14x6y0, "G14x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x6y0C1Ev();
extern void _ZN7G14x6y0D1Ev();
Name_Map name_map_G14x6y0[] = {
  NSPAIR(_ZN7G14x6y0C1Ev),
  NSPAIR(_ZN7G14x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y0[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y0[] = {
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y0[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y0[] = {
  {&(_ZTV7G14x6y0[5]),  5,12},
  {&(_tg__ZTV5E14x6__7G14x6y0[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y0[3]),  3,4},
  {&(_ZTV7G14x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G14x6y0[];
extern  VTBL_ENTRY _ZTV7G14x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y0[];
Class_Descriptor cd_G14x6y0 = {  "G14x6y0", // class name
  bases_G14x6y0, 6,
  &(vtc_G14x6y0[0]), // expected_vtbl_contents
  &(vtt_G14x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y0),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y1  : virtual E14x6 , F1 {
  int ff;
  ~G14x6y1(); // tgen
  G14x6y1(); // tgen
};
//SIG(1 G14x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x6y1 ::~G14x6y1(){ note_dtor("G14x6y1", this);} // tgen
G14x6y1 ::G14x6y1(){ note_ctor("G14x6y1", this);} // tgen

static void Test_G14x6y1()
{
  extern Class_Descriptor cd_G14x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x6y1, buf);
    G14x6y1 *dp, &lv = *(dp=new (buf) G14x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y1)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(32,24), "G14x6y1");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(40,28), "G14x6y1");
    check_base_class_offset(lv, (C14*)(E14x6*), ABISELECT(16,12), "G14x6y1");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(52,36), "G14x6y1");
    check_base_class_offset(lv, (E14x6*), ABISELECT(16,12), "G14x6y1");
    check_base_class_offset(lv, (F1*), 0, "G14x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x6y1.ff");
    test_class_info(&lv, &cd_G14x6y1);
    dp->~G14x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y1(Test_G14x6y1, "G14x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x6y1C1Ev();
extern void _ZN7G14x6y1D1Ev();
Name_Map name_map_G14x6y1[] = {
  NSPAIR(_ZN7G14x6y1C1Ev),
  NSPAIR(_ZN7G14x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x6y1[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y1[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y1[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y1[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y1[] = {
  {&(_ZTV7G14x6y1[6]),  6,16},
  {&(_ZTV7G14x6y1[12]),  12,16},
  {&(_ZTV7G14x6y1[15]),  15,16},
  {&(_tg__ZTV5E14x6__7G14x6y1[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x6y1[];
extern  VTBL_ENTRY _ZTV7G14x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y1[];
Class_Descriptor cd_G14x6y1 = {  "G14x6y1", // class name
  bases_G14x6y1, 6,
  &(vtc_G14x6y1[0]), // expected_vtbl_contents
  &(vtt_G14x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y1),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y2  : E14x6 , virtual F1 {
  int ff;
  ~G14x6y2(); // tgen
  G14x6y2(); // tgen
};
//SIG(1 G14x6y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x6y2 ::~G14x6y2(){ note_dtor("G14x6y2", this);} // tgen
G14x6y2 ::G14x6y2(){ note_ctor("G14x6y2", this);} // tgen

static void Test_G14x6y2()
{
  extern Class_Descriptor cd_G14x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x6y2, buf);
    G14x6y2 *dp, &lv = *(dp=new (buf) G14x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y2)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(20,16), "G14x6y2");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(24,20), "G14x6y2");
    check_base_class_offset(lv, (C14*)(E14x6*), 0, "G14x6y2");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(36,28), "G14x6y2");
    check_base_class_offset(lv, (E14x6*), 0, "G14x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G14x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x6y2.ff");
    test_class_info(&lv, &cd_G14x6y2);
    dp->~G14x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y2(Test_G14x6y2, "G14x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x6y2C1Ev();
extern void _ZN7G14x6y2D1Ev();
Name_Map name_map_G14x6y2[] = {
  NSPAIR(_ZN7G14x6y2C1Ev),
  NSPAIR(_ZN7G14x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y2[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G14x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G14x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y2[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y2[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y2[] = {
  {&(_ZTV7G14x6y2[6]),  6,14},
  {&(_tg__ZTV5E14x6__7G14x6y2[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y2[3]),  3,4},
  {&(_ZTV7G14x6y2[9]),  9,14},
  {&(_ZTV7G14x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G14x6y2[];
extern  VTBL_ENTRY _ZTV7G14x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y2[];
Class_Descriptor cd_G14x6y2 = {  "G14x6y2", // class name
  bases_G14x6y2, 6,
  &(vtc_G14x6y2[0]), // expected_vtbl_contents
  &(vtt_G14x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y2),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y3  : virtual E14x6 , virtual F1 {
  int ff;
  ~G14x6y3(); // tgen
  G14x6y3(); // tgen
};
//SIG(1 G14x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x6y3 ::~G14x6y3(){ note_dtor("G14x6y3", this);} // tgen
G14x6y3 ::G14x6y3(){ note_ctor("G14x6y3", this);} // tgen

static void Test_G14x6y3()
{
  extern Class_Descriptor cd_G14x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x6y3, buf);
    G14x6y3 *dp, &lv = *(dp=new (buf) G14x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y3)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(32,20), "G14x6y3");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(40,24), "G14x6y3");
    check_base_class_offset(lv, (C14*)(E14x6*), ABISELECT(16,8), "G14x6y3");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(52,32), "G14x6y3");
    check_base_class_offset(lv, (E14x6*), ABISELECT(16,8), "G14x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G14x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x6y3.ff");
    test_class_info(&lv, &cd_G14x6y3);
    dp->~G14x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y3(Test_G14x6y3, "G14x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G14x6y3C1Ev();
extern void _ZN7G14x6y3D1Ev();
Name_Map name_map_G14x6y3[] = {
  NSPAIR(_ZN7G14x6y3C1Ev),
  NSPAIR(_ZN7G14x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y3[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x6y3[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G14x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G14x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y3[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y3[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y3[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y3[] = {
  {&(_ZTV7G14x6y3[7]),  7,20},
  {&(_ZTV7G14x6y3[12]),  12,20},
  {&(_ZTV7G14x6y3[15]),  15,20},
  {&(_ZTV7G14x6y3[19]),  19,20},
  {&(_tg__ZTV5E14x6__7G14x6y3[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x6y3[];
extern  VTBL_ENTRY _ZTV7G14x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y3[];
Class_Descriptor cd_G14x6y3 = {  "G14x6y3", // class name
  bases_G14x6y3, 6,
  &(vtc_G14x6y3[0]), // expected_vtbl_contents
  &(vtt_G14x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G14x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y3),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y4  : E14x6 , F0 {
  int ff;
  ~G14x6y4(); // tgen
  G14x6y4(); // tgen
};
//SIG(1 G14x6y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G14x6y4 ::~G14x6y4(){ note_dtor("G14x6y4", this);} // tgen
G14x6y4 ::G14x6y4(){ note_ctor("G14x6y4", this);} // tgen

static void Test_G14x6y4()
{
  extern Class_Descriptor cd_G14x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x6y4, buf);
    G14x6y4 *dp, &lv = *(dp=new (buf) G14x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y4)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(24,20), "G14x6y4");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(32,24), "G14x6y4");
    check_base_class_offset(lv, (C14*)(E14x6*), 0, "G14x6y4");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(44,32), "G14x6y4");
    check_base_class_offset(lv, (E14x6*), 0, "G14x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G14x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G14x6y4.ff");
    test_class_info(&lv, &cd_G14x6y4);
    dp->~G14x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y4(Test_G14x6y4, "G14x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G14x6y4C1Ev();
extern void _ZN7G14x6y4D1Ev();
Name_Map name_map_G14x6y4[] = {
  NSPAIR(_ZN7G14x6y4C1Ev),
  NSPAIR(_ZN7G14x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y4[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y4[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y4[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y4[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y4[] = {
  {&(_ZTV7G14x6y4[5]),  5,9},
  {&(_tg__ZTV5E14x6__7G14x6y4[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y4[3]),  3,4},
  {&(_ZTV7G14x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G14x6y4[];
extern  VTBL_ENTRY _ZTV7G14x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y4[];
Class_Descriptor cd_G14x6y4 = {  "G14x6y4", // class name
  bases_G14x6y4, 6,
  &(vtc_G14x6y4[0]), // expected_vtbl_contents
  &(vtt_G14x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G14x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y4),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y5  : virtual E14x6 , F0 {
  int ff;
  ~G14x6y5(); // tgen
  G14x6y5(); // tgen
};
//SIG(1 G14x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G14x6y5 ::~G14x6y5(){ note_dtor("G14x6y5", this);} // tgen
G14x6y5 ::G14x6y5(){ note_ctor("G14x6y5", this);} // tgen

static void Test_G14x6y5()
{
  extern Class_Descriptor cd_G14x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x6y5, buf);
    G14x6y5 *dp, &lv = *(dp=new (buf) G14x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y5)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(32,24), "G14x6y5");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(40,28), "G14x6y5");
    check_base_class_offset(lv, (C14*)(E14x6*), ABISELECT(16,12), "G14x6y5");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(52,36), "G14x6y5");
    check_base_class_offset(lv, (E14x6*), ABISELECT(16,12), "G14x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x6y5.ff");
    test_class_info(&lv, &cd_G14x6y5);
    dp->~G14x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y5(Test_G14x6y5, "G14x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x6y5C1Ev();
extern void _ZN7G14x6y5D1Ev();
Name_Map name_map_G14x6y5[] = {
  NSPAIR(_ZN7G14x6y5C1Ev),
  NSPAIR(_ZN7G14x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y5[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x6y5[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y5[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y5[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y5[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y5[] = {
  {&(_ZTV7G14x6y5[6]),  6,15},
  {&(_ZTV7G14x6y5[11]),  11,15},
  {&(_ZTV7G14x6y5[14]),  14,15},
  {&(_tg__ZTV5E14x6__7G14x6y5[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x6y5[];
extern  VTBL_ENTRY _ZTV7G14x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y5[];
Class_Descriptor cd_G14x6y5 = {  "G14x6y5", // class name
  bases_G14x6y5, 6,
  &(vtc_G14x6y5[0]), // expected_vtbl_contents
  &(vtt_G14x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y5),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y6  : E14x6 , virtual F0 {
  int ff;
  ~G14x6y6(); // tgen
  G14x6y6(); // tgen
};
//SIG(1 G14x6y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x6y6 ::~G14x6y6(){ note_dtor("G14x6y6", this);} // tgen
G14x6y6 ::G14x6y6(){ note_ctor("G14x6y6", this);} // tgen

static void Test_G14x6y6()
{
  extern Class_Descriptor cd_G14x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G14x6y6, buf);
    G14x6y6 *dp, &lv = *(dp=new (buf) G14x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G14x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y6)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(20,16), "G14x6y6");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(24,20), "G14x6y6");
    check_base_class_offset(lv, (C14*)(E14x6*), 0, "G14x6y6");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(36,28), "G14x6y6");
    check_base_class_offset(lv, (E14x6*), 0, "G14x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G14x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x6y6.ff");
    test_class_info(&lv, &cd_G14x6y6);
    dp->~G14x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y6(Test_G14x6y6, "G14x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G14x6y6C1Ev();
extern void _ZN7G14x6y6D1Ev();
Name_Map name_map_G14x6y6[] = {
  NSPAIR(_ZN7G14x6y6C1Ev),
  NSPAIR(_ZN7G14x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y6[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G14x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y6[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y6[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y6[] = {
  {&(_ZTV7G14x6y6[6]),  6,10},
  {&(_tg__ZTV5E14x6__7G14x6y6[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y6[3]),  3,4},
  {&(_ZTV7G14x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G14x6y6[];
extern  VTBL_ENTRY _ZTV7G14x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y6[];
Class_Descriptor cd_G14x6y6 = {  "G14x6y6", // class name
  bases_G14x6y6, 6,
  &(vtc_G14x6y6[0]), // expected_vtbl_contents
  &(vtt_G14x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G14x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y6),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x6y7  : virtual E14x6 , virtual F0 {
  int ff;
  ~G14x6y7(); // tgen
  G14x6y7(); // tgen
};
//SIG(1 G14x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x6y7 ::~G14x6y7(){ note_dtor("G14x6y7", this);} // tgen
G14x6y7 ::G14x6y7(){ note_ctor("G14x6y7", this);} // tgen

static void Test_G14x6y7()
{
  extern Class_Descriptor cd_G14x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G14x6y7, buf);
    G14x6y7 *dp, &lv = *(dp=new (buf) G14x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G14x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x6y7)");
    check_base_class_offset(lv, (A0*)(C14*)(E14x6*), ABISELECT(32,20), "G14x6y7");
    check_base_class_offset(lv, (B1*)(C14*)(E14x6*), ABISELECT(40,24), "G14x6y7");
    check_base_class_offset(lv, (C14*)(E14x6*), ABISELECT(16,8), "G14x6y7");
    check_base_class_offset(lv, (D0*)(E14x6*), ABISELECT(52,32), "G14x6y7");
    check_base_class_offset(lv, (E14x6*), ABISELECT(16,8), "G14x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G14x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x6y7.ff");
    test_class_info(&lv, &cd_G14x6y7);
    dp->~G14x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x6y7(Test_G14x6y7, "G14x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G14x6y7C1Ev();
extern void _ZN7G14x6y7D1Ev();
Name_Map name_map_G14x6y7[] = {
  NSPAIR(_ZN7G14x6y7C1Ev),
  NSPAIR(_ZN7G14x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x6;
extern VTBL_ENTRY _ZTI5E14x6[];
extern  VTBL_ENTRY _ZTV5E14x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x6y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x6y7[0]),
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x6y7[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G14x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x6y7[];
static  VTBL_ENTRY _tg__ZTV5E14x6__7G14x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C145E14x6__7G14x6y7[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C145E14x6__7G14x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x6__7G14x6y7[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x6y7[] = {
  {&(_ZTV7G14x6y7[7]),  7,16},
  {&(_ZTV7G14x6y7[12]),  12,16},
  {&(_ZTV7G14x6y7[15]),  15,16},
  {&(_tg__ZTV5E14x6__7G14x6y7[5]),  5,5},
  {&(_tg__ZTV3C145E14x6__7G14x6y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C145E14x6__7G14x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E14x6__7G14x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x6y7[];
extern  VTBL_ENTRY _ZTV7G14x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x6y7[];
Class_Descriptor cd_G14x6y7 = {  "G14x6y7", // class name
  bases_G14x6y7, 6,
  &(vtc_G14x6y7[0]), // expected_vtbl_contents
  &(vtt_G14x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G14x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x6y7),16, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E15x6  : C15 , virtual D0 {
  int fd;
  ~E15x6(); // tgen
  E15x6(); // tgen
};
//SIG(-1 E15x6) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E15x6 ::~E15x6(){ note_dtor("E15x6", this);} // tgen
E15x6 ::E15x6(){ note_ctor("E15x6", this);} // tgen

static void Test_E15x6()
{
  extern Class_Descriptor cd_E15x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E15x6, buf);
    E15x6 *dp, &lv = *(dp=new (buf) E15x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E15x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x6)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(16,12), "E15x6");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(32,20), "E15x6");
    check_base_class_offset(lv, (C15*), 0, "E15x6");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E15x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E15x6.fd");
    test_class_info(&lv, &cd_E15x6);
    dp->~E15x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x6(Test_E15x6, "E15x6", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E15x6C1Ev();
extern void _ZN5E15x6D1Ev();
Name_Map name_map_E15x6[] = {
  NSPAIR(_ZN5E15x6C1Ev),
  NSPAIR(_ZN5E15x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E15x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E15x6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E15x6[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E15x6[];
static  VTBL_ENTRY _tg__ZTV3C15__5E15x6[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__5E15x6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__5E15x6[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x6[] = {
  {&(_ZTV5E15x6[5]),  5,13},
  {&(_tg__ZTV3C15__5E15x6[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__5E15x6[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__5E15x6[3]),  3,4},
  {&(_ZTV5E15x6[8]),  8,13},
  {&(_ZTV5E15x6[12]),  12,13},
};
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
Class_Descriptor cd_E15x6 = {  "E15x6", // class name
  bases_E15x6, 4,
  &(vtc_E15x6[0]), // expected_vtbl_contents
  &(vtt_E15x6[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E15x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E15x6),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E15x6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y0  : E15x6 , F1 {
  int ff;
  ~G15x6y0(); // tgen
  G15x6y0(); // tgen
};
//SIG(1 G15x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x6y0 ::~G15x6y0(){ note_dtor("G15x6y0", this);} // tgen
G15x6y0 ::G15x6y0(){ note_ctor("G15x6y0", this);} // tgen

static void Test_G15x6y0()
{
  extern Class_Descriptor cd_G15x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G15x6y0, buf);
    G15x6y0 *dp, &lv = *(dp=new (buf) G15x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G15x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y0)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(32,24), "G15x6y0");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(48,32), "G15x6y0");
    check_base_class_offset(lv, (C15*)(E15x6*), 0, "G15x6y0");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(60,40), "G15x6y0");
    check_base_class_offset(lv, (E15x6*), 0, "G15x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G15x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G15x6y0.ff");
    test_class_info(&lv, &cd_G15x6y0);
    dp->~G15x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y0(Test_G15x6y0, "G15x6y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G15x6y0C1Ev();
extern void _ZN7G15x6y0D1Ev();
Name_Map name_map_G15x6y0[] = {
  NSPAIR(_ZN7G15x6y0C1Ev),
  NSPAIR(_ZN7G15x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x6y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y0[0]),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x6y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x6y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y0[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y0[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y0[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y0[] = {
  {&(_ZTV7G15x6y0[5]),  5,16},
  {&(_tg__ZTV5E15x6__7G15x6y0[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y0[3]),  3,4},
  {&(_ZTV7G15x6y0[11]),  11,16},
  {&(_ZTV7G15x6y0[15]),  15,16},
};
extern VTBL_ENTRY _ZTI7G15x6y0[];
extern  VTBL_ENTRY _ZTV7G15x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y0[];
Class_Descriptor cd_G15x6y0 = {  "G15x6y0", // class name
  bases_G15x6y0, 6,
  &(vtc_G15x6y0[0]), // expected_vtbl_contents
  &(vtt_G15x6y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G15x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y0),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y0),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y1  : virtual E15x6 , F1 {
  int ff;
  ~G15x6y1(); // tgen
  G15x6y1(); // tgen
};
//SIG(1 G15x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x6y1 ::~G15x6y1(){ note_dtor("G15x6y1", this);} // tgen
G15x6y1 ::G15x6y1(){ note_ctor("G15x6y1", this);} // tgen

static void Test_G15x6y1()
{
  extern Class_Descriptor cd_G15x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G15x6y1, buf);
    G15x6y1 *dp, &lv = *(dp=new (buf) G15x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G15x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y1)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(32,24), "G15x6y1");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(48,32), "G15x6y1");
    check_base_class_offset(lv, (C15*)(E15x6*), ABISELECT(16,12), "G15x6y1");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(60,40), "G15x6y1");
    check_base_class_offset(lv, (E15x6*), ABISELECT(16,12), "G15x6y1");
    check_base_class_offset(lv, (F1*), 0, "G15x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x6y1.ff");
    test_class_info(&lv, &cd_G15x6y1);
    dp->~G15x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y1(Test_G15x6y1, "G15x6y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G15x6y1C1Ev();
extern void _ZN7G15x6y1D1Ev();
Name_Map name_map_G15x6y1[] = {
  NSPAIR(_ZN7G15x6y1C1Ev),
  NSPAIR(_ZN7G15x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x6y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x6y1[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x6y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x6y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y1[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y1[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y1[] = {
  {&(_ZTV7G15x6y1[6]),  6,20},
  {&(_ZTV7G15x6y1[12]),  12,20},
  {&(_ZTV7G15x6y1[15]),  15,20},
  {&(_ZTV7G15x6y1[19]),  19,20},
  {&(_tg__ZTV5E15x6__7G15x6y1[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x6y1[];
extern  VTBL_ENTRY _ZTV7G15x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y1[];
Class_Descriptor cd_G15x6y1 = {  "G15x6y1", // class name
  bases_G15x6y1, 6,
  &(vtc_G15x6y1[0]), // expected_vtbl_contents
  &(vtt_G15x6y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G15x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y1),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y1),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y2  : E15x6 , virtual F1 {
  int ff;
  ~G15x6y2(); // tgen
  G15x6y2(); // tgen
};
//SIG(1 G15x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x6y2 ::~G15x6y2(){ note_dtor("G15x6y2", this);} // tgen
G15x6y2 ::G15x6y2(){ note_ctor("G15x6y2", this);} // tgen

static void Test_G15x6y2()
{
  extern Class_Descriptor cd_G15x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x6y2, buf);
    G15x6y2 *dp, &lv = *(dp=new (buf) G15x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y2)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(24,16), "G15x6y2");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(40,24), "G15x6y2");
    check_base_class_offset(lv, (C15*)(E15x6*), 0, "G15x6y2");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(52,32), "G15x6y2");
    check_base_class_offset(lv, (E15x6*), 0, "G15x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G15x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x6y2.ff");
    test_class_info(&lv, &cd_G15x6y2);
    dp->~G15x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y2(Test_G15x6y2, "G15x6y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x6y2C1Ev();
extern void _ZN7G15x6y2D1Ev();
Name_Map name_map_G15x6y2[] = {
  NSPAIR(_ZN7G15x6y2C1Ev),
  NSPAIR(_ZN7G15x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    10, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x6y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y2[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G15x6y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x6y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G15x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y2[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y2[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y2[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y2[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y2[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y2[] = {
  {&(_ZTV7G15x6y2[6]),  6,18},
  {&(_tg__ZTV5E15x6__7G15x6y2[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y2[3]),  3,4},
  {&(_ZTV7G15x6y2[9]),  9,18},
  {&(_ZTV7G15x6y2[13]),  13,18},
  {&(_ZTV7G15x6y2[17]),  17,18},
};
extern VTBL_ENTRY _ZTI7G15x6y2[];
extern  VTBL_ENTRY _ZTV7G15x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y2[];
Class_Descriptor cd_G15x6y2 = {  "G15x6y2", // class name
  bases_G15x6y2, 6,
  &(vtc_G15x6y2[0]), // expected_vtbl_contents
  &(vtt_G15x6y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y2),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y2),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y3  : virtual E15x6 , virtual F1 {
  int ff;
  ~G15x6y3(); // tgen
  G15x6y3(); // tgen
};
//SIG(1 G15x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x6y3 ::~G15x6y3(){ note_dtor("G15x6y3", this);} // tgen
G15x6y3 ::G15x6y3(){ note_ctor("G15x6y3", this);} // tgen

static void Test_G15x6y3()
{
  extern Class_Descriptor cd_G15x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x6y3, buf);
    G15x6y3 *dp, &lv = *(dp=new (buf) G15x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y3)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(32,20), "G15x6y3");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(48,28), "G15x6y3");
    check_base_class_offset(lv, (C15*)(E15x6*), ABISELECT(16,8), "G15x6y3");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(60,36), "G15x6y3");
    check_base_class_offset(lv, (E15x6*), ABISELECT(16,8), "G15x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G15x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x6y3.ff");
    test_class_info(&lv, &cd_G15x6y3);
    dp->~G15x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y3(Test_G15x6y3, "G15x6y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x6y3C1Ev();
extern void _ZN7G15x6y3D1Ev();
Name_Map name_map_G15x6y3[] = {
  NSPAIR(_ZN7G15x6y3C1Ev),
  NSPAIR(_ZN7G15x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x6y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x6y3[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x6y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x6y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G15x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y3[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y3[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y3[] = {
  {&(_ZTV7G15x6y3[7]),  7,24},
  {&(_ZTV7G15x6y3[12]),  12,24},
  {&(_ZTV7G15x6y3[15]),  15,24},
  {&(_ZTV7G15x6y3[19]),  19,24},
  {&(_ZTV7G15x6y3[23]),  23,24},
  {&(_tg__ZTV5E15x6__7G15x6y3[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x6y3[];
extern  VTBL_ENTRY _ZTV7G15x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y3[];
Class_Descriptor cd_G15x6y3 = {  "G15x6y3", // class name
  bases_G15x6y3, 6,
  &(vtc_G15x6y3[0]), // expected_vtbl_contents
  &(vtt_G15x6y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y3),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y3),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y4  : E15x6 , F0 {
  int ff;
  ~G15x6y4(); // tgen
  G15x6y4(); // tgen
};
//SIG(1 G15x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G15x6y4 ::~G15x6y4(){ note_dtor("G15x6y4", this);} // tgen
G15x6y4 ::G15x6y4(){ note_ctor("G15x6y4", this);} // tgen

static void Test_G15x6y4()
{
  extern Class_Descriptor cd_G15x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G15x6y4, buf);
    G15x6y4 *dp, &lv = *(dp=new (buf) G15x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G15x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y4)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(24,20), "G15x6y4");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(40,28), "G15x6y4");
    check_base_class_offset(lv, (C15*)(E15x6*), 0, "G15x6y4");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(52,36), "G15x6y4");
    check_base_class_offset(lv, (E15x6*), 0, "G15x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G15x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G15x6y4.ff");
    test_class_info(&lv, &cd_G15x6y4);
    dp->~G15x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y4(Test_G15x6y4, "G15x6y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G15x6y4C1Ev();
extern void _ZN7G15x6y4D1Ev();
Name_Map name_map_G15x6y4[] = {
  NSPAIR(_ZN7G15x6y4C1Ev),
  NSPAIR(_ZN7G15x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x6y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y4[0]),
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G15x6y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G15x6y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y4[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y4[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y4[] = {
  0,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y4[] = {
  {&(_ZTV7G15x6y4[5]),  5,13},
  {&(_tg__ZTV5E15x6__7G15x6y4[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y4[3]),  3,4},
  {&(_ZTV7G15x6y4[8]),  8,13},
  {&(_ZTV7G15x6y4[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G15x6y4[];
extern  VTBL_ENTRY _ZTV7G15x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y4[];
Class_Descriptor cd_G15x6y4 = {  "G15x6y4", // class name
  bases_G15x6y4, 6,
  &(vtc_G15x6y4[0]), // expected_vtbl_contents
  &(vtt_G15x6y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G15x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y4),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y4),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y5  : virtual E15x6 , F0 {
  int ff;
  ~G15x6y5(); // tgen
  G15x6y5(); // tgen
};
//SIG(1 G15x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G15x6y5 ::~G15x6y5(){ note_dtor("G15x6y5", this);} // tgen
G15x6y5 ::G15x6y5(){ note_ctor("G15x6y5", this);} // tgen

static void Test_G15x6y5()
{
  extern Class_Descriptor cd_G15x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G15x6y5, buf);
    G15x6y5 *dp, &lv = *(dp=new (buf) G15x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G15x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y5)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(32,24), "G15x6y5");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(48,32), "G15x6y5");
    check_base_class_offset(lv, (C15*)(E15x6*), ABISELECT(16,12), "G15x6y5");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(60,40), "G15x6y5");
    check_base_class_offset(lv, (E15x6*), ABISELECT(16,12), "G15x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x6y5.ff");
    test_class_info(&lv, &cd_G15x6y5);
    dp->~G15x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y5(Test_G15x6y5, "G15x6y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G15x6y5C1Ev();
extern void _ZN7G15x6y5D1Ev();
Name_Map name_map_G15x6y5[] = {
  NSPAIR(_ZN7G15x6y5C1Ev),
  NSPAIR(_ZN7G15x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x6y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x6y5[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G15x6y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G15x6y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y5[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y5[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y5[] = {
  {&(_ZTV7G15x6y5[6]),  6,19},
  {&(_ZTV7G15x6y5[11]),  11,19},
  {&(_ZTV7G15x6y5[14]),  14,19},
  {&(_ZTV7G15x6y5[18]),  18,19},
  {&(_tg__ZTV5E15x6__7G15x6y5[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x6y5[];
extern  VTBL_ENTRY _ZTV7G15x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y5[];
Class_Descriptor cd_G15x6y5 = {  "G15x6y5", // class name
  bases_G15x6y5, 6,
  &(vtc_G15x6y5[0]), // expected_vtbl_contents
  &(vtt_G15x6y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G15x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y5),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y5),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y6  : E15x6 , virtual F0 {
  int ff;
  ~G15x6y6(); // tgen
  G15x6y6(); // tgen
};
//SIG(1 G15x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x6y6 ::~G15x6y6(){ note_dtor("G15x6y6", this);} // tgen
G15x6y6 ::G15x6y6(){ note_ctor("G15x6y6", this);} // tgen

static void Test_G15x6y6()
{
  extern Class_Descriptor cd_G15x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G15x6y6, buf);
    G15x6y6 *dp, &lv = *(dp=new (buf) G15x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G15x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y6)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(24,16), "G15x6y6");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(40,24), "G15x6y6");
    check_base_class_offset(lv, (C15*)(E15x6*), 0, "G15x6y6");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(52,32), "G15x6y6");
    check_base_class_offset(lv, (E15x6*), 0, "G15x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G15x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x6y6.ff");
    test_class_info(&lv, &cd_G15x6y6);
    dp->~G15x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y6(Test_G15x6y6, "G15x6y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G15x6y6C1Ev();
extern void _ZN7G15x6y6D1Ev();
Name_Map name_map_G15x6y6[] = {
  NSPAIR(_ZN7G15x6y6C1Ev),
  NSPAIR(_ZN7G15x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x6y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y6[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G15x6y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x6y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y6[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y6[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y6[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y6[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y6[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y6[] = {
  {&(_ZTV7G15x6y6[6]),  6,14},
  {&(_tg__ZTV5E15x6__7G15x6y6[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y6[3]),  3,4},
  {&(_ZTV7G15x6y6[9]),  9,14},
  {&(_ZTV7G15x6y6[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G15x6y6[];
extern  VTBL_ENTRY _ZTV7G15x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y6[];
Class_Descriptor cd_G15x6y6 = {  "G15x6y6", // class name
  bases_G15x6y6, 6,
  &(vtc_G15x6y6[0]), // expected_vtbl_contents
  &(vtt_G15x6y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G15x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y6),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y6),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x6y7  : virtual E15x6 , virtual F0 {
  int ff;
  ~G15x6y7(); // tgen
  G15x6y7(); // tgen
};
//SIG(1 G15x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x6y7 ::~G15x6y7(){ note_dtor("G15x6y7", this);} // tgen
G15x6y7 ::G15x6y7(){ note_ctor("G15x6y7", this);} // tgen

static void Test_G15x6y7()
{
  extern Class_Descriptor cd_G15x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x6y7, buf);
    G15x6y7 *dp, &lv = *(dp=new (buf) G15x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x6y7)");
    check_base_class_offset(lv, (A1*)(C15*)(E15x6*), ABISELECT(32,20), "G15x6y7");
    check_base_class_offset(lv, (B1*)(C15*)(E15x6*), ABISELECT(48,28), "G15x6y7");
    check_base_class_offset(lv, (C15*)(E15x6*), ABISELECT(16,8), "G15x6y7");
    check_base_class_offset(lv, (D0*)(E15x6*), ABISELECT(60,36), "G15x6y7");
    check_base_class_offset(lv, (E15x6*), ABISELECT(16,8), "G15x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G15x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x6y7.ff");
    test_class_info(&lv, &cd_G15x6y7);
    dp->~G15x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x6y7(Test_G15x6y7, "G15x6y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x6y7C1Ev();
extern void _ZN7G15x6y7D1Ev();
Name_Map name_map_G15x6y7[] = {
  NSPAIR(_ZN7G15x6y7C1Ev),
  NSPAIR(_ZN7G15x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x6;
extern VTBL_ENTRY _ZTI5E15x6[];
extern  VTBL_ENTRY _ZTV5E15x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x6y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x6y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x6y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x6y7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x6y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x6y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x6y7[];
static  VTBL_ENTRY _tg__ZTV5E15x6__7G15x6y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
};
static  VTBL_ENTRY _tg__ZTV3C155E15x6__7G15x6y7[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C155E15x6__7G15x6y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C155E15x6__7G15x6y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x6__7G15x6y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x6__7G15x6y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x6y7[] = {
  {&(_ZTV7G15x6y7[7]),  7,20},
  {&(_ZTV7G15x6y7[12]),  12,20},
  {&(_ZTV7G15x6y7[15]),  15,20},
  {&(_ZTV7G15x6y7[19]),  19,20},
  {&(_tg__ZTV5E15x6__7G15x6y7[5]),  5,5},
  {&(_tg__ZTV3C155E15x6__7G15x6y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C155E15x6__7G15x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C155E15x6__7G15x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E15x6__7G15x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x6__7G15x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x6y7[];
extern  VTBL_ENTRY _ZTV7G15x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x6y7[];
Class_Descriptor cd_G15x6y7 = {  "G15x6y7", // class name
  bases_G15x6y7, 6,
  &(vtc_G15x6y7[0]), // expected_vtbl_contents
  &(vtt_G15x6y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x6y7),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x6y7),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E16x6  : C16 , virtual D0 {
  int fd;
  ~E16x6(); // tgen
  E16x6(); // tgen
};
//SIG(-1 E16x6) C1{ BC2{ BC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E16x6 ::~E16x6(){ note_dtor("E16x6", this);} // tgen
E16x6 ::E16x6(){ note_ctor("E16x6", this);} // tgen

static void Test_E16x6()
{
  extern Class_Descriptor cd_E16x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E16x6, buf);
    E16x6 *dp, &lv = *(dp=new (buf) E16x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E16x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x6)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(8,4), "E16x6");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(12,8), "E16x6");
    check_base_class_offset(lv, (C16*), 0, "E16x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E16x6");
    check_field_offset(lv, fd, ABISELECT(20,16), "E16x6.fd");
    test_class_info(&lv, &cd_E16x6);
    dp->~E16x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x6(Test_E16x6, "E16x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E16x6C1Ev();
extern void _ZN5E16x6D1Ev();
Name_Map name_map_E16x6[] = {
  NSPAIR(_ZN5E16x6C1Ev),
  NSPAIR(_ZN5E16x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E16x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E16x6[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_E16x6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV5E16x6[];
static  VTT_ENTRY vtt_E16x6[] = {
  {&(_ZTV5E16x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
Class_Descriptor cd_E16x6 = {  "E16x6", // class name
  bases_E16x6, 4,
  &(vtc_E16x6[0]), // expected_vtbl_contents
  &(vtt_E16x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E16x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E16x6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E16x6),1, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y0  : E16x6 , F1 {
  int ff;
  ~G16x6y0(); // tgen
  G16x6y0(); // tgen
};
//SIG(1 G16x6y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x6y0 ::~G16x6y0(){ note_dtor("G16x6y0", this);} // tgen
G16x6y0 ::G16x6y0(){ note_ctor("G16x6y0", this);} // tgen

static void Test_G16x6y0()
{
  extern Class_Descriptor cd_G16x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x6y0, buf);
    G16x6y0 *dp, &lv = *(dp=new (buf) G16x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y0)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(8,4), "G16x6y0");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(12,8), "G16x6y0");
    check_base_class_offset(lv, (C16*)(E16x6*), 0, "G16x6y0");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(40,32), "G16x6y0");
    check_base_class_offset(lv, (E16x6*), 0, "G16x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G16x6y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G16x6y0.ff");
    test_class_info(&lv, &cd_G16x6y0);
    dp->~G16x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y0(Test_G16x6y0, "G16x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x6y0C1Ev();
extern void _ZN7G16x6y0D1Ev();
Name_Map name_map_G16x6y0[] = {
  NSPAIR(_ZN7G16x6y0C1Ev),
  NSPAIR(_ZN7G16x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y0[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y0[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G16x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y0[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y0[] = {
  {&(_ZTV7G16x6y0[3]),  3,7},
  {&(_tg__ZTV5E16x6__7G16x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y0[];
extern  VTBL_ENTRY _ZTV7G16x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y0[];
Class_Descriptor cd_G16x6y0 = {  "G16x6y0", // class name
  bases_G16x6y0, 6,
  &(vtc_G16x6y0[0]), // expected_vtbl_contents
  &(vtt_G16x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y0),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y1  : virtual E16x6 , F1 {
  int ff;
  ~G16x6y1(); // tgen
  G16x6y1(); // tgen
};
//SIG(1 G16x6y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x6y1 ::~G16x6y1(){ note_dtor("G16x6y1", this);} // tgen
G16x6y1 ::G16x6y1(){ note_ctor("G16x6y1", this);} // tgen

static void Test_G16x6y1()
{
  extern Class_Descriptor cd_G16x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x6y1, buf);
    G16x6y1 *dp, &lv = *(dp=new (buf) G16x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y1)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(24,16), "G16x6y1");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(28,20), "G16x6y1");
    check_base_class_offset(lv, (C16*)(E16x6*), ABISELECT(16,12), "G16x6y1");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(40,32), "G16x6y1");
    check_base_class_offset(lv, (E16x6*), ABISELECT(16,12), "G16x6y1");
    check_base_class_offset(lv, (F1*), 0, "G16x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x6y1.ff");
    test_class_info(&lv, &cd_G16x6y1);
    dp->~G16x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y1(Test_G16x6y1, "G16x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x6y1C1Ev();
extern void _ZN7G16x6y1D1Ev();
Name_Map name_map_G16x6y1[] = {
  NSPAIR(_ZN7G16x6y1C1Ev),
  NSPAIR(_ZN7G16x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x6y1[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y1[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y1[] = {
  {&(_ZTV7G16x6y1[4]),  4,10},
  {&(_ZTV7G16x6y1[9]),  9,10},
  {&(_tg__ZTV5E16x6__7G16x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y1[];
extern  VTBL_ENTRY _ZTV7G16x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y1[];
Class_Descriptor cd_G16x6y1 = {  "G16x6y1", // class name
  bases_G16x6y1, 6,
  &(vtc_G16x6y1[0]), // expected_vtbl_contents
  &(vtt_G16x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y1),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y2  : E16x6 , virtual F1 {
  int ff;
  ~G16x6y2(); // tgen
  G16x6y2(); // tgen
};
//SIG(1 G16x6y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x6y2 ::~G16x6y2(){ note_dtor("G16x6y2", this);} // tgen
G16x6y2 ::G16x6y2(){ note_ctor("G16x6y2", this);} // tgen

static void Test_G16x6y2()
{
  extern Class_Descriptor cd_G16x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x6y2, buf);
    G16x6y2 *dp, &lv = *(dp=new (buf) G16x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y2)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(8,4), "G16x6y2");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(12,8), "G16x6y2");
    check_base_class_offset(lv, (C16*)(E16x6*), 0, "G16x6y2");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(28,24), "G16x6y2");
    check_base_class_offset(lv, (E16x6*), 0, "G16x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G16x6y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G16x6y2.ff");
    test_class_info(&lv, &cd_G16x6y2);
    dp->~G16x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y2(Test_G16x6y2, "G16x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x6y2C1Ev();
extern void _ZN7G16x6y2D1Ev();
Name_Map name_map_G16x6y2[] = {
  NSPAIR(_ZN7G16x6y2C1Ev),
  NSPAIR(_ZN7G16x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y2[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y2[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G16x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y2[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y2[] = {
  {&(_ZTV7G16x6y2[4]),  4,9},
  {&(_tg__ZTV5E16x6__7G16x6y2[3]),  3,4},
  {&(_ZTV7G16x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G16x6y2[];
extern  VTBL_ENTRY _ZTV7G16x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y2[];
Class_Descriptor cd_G16x6y2 = {  "G16x6y2", // class name
  bases_G16x6y2, 6,
  &(vtc_G16x6y2[0]), // expected_vtbl_contents
  &(vtt_G16x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y2),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y3  : virtual E16x6 , virtual F1 {
  int ff;
  ~G16x6y3(); // tgen
  G16x6y3(); // tgen
};
//SIG(1 G16x6y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x6y3 ::~G16x6y3(){ note_dtor("G16x6y3", this);} // tgen
G16x6y3 ::G16x6y3(){ note_ctor("G16x6y3", this);} // tgen

static void Test_G16x6y3()
{
  extern Class_Descriptor cd_G16x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x6y3, buf);
    G16x6y3 *dp, &lv = *(dp=new (buf) G16x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y3)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(24,12), "G16x6y3");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(28,16), "G16x6y3");
    check_base_class_offset(lv, (C16*)(E16x6*), ABISELECT(16,8), "G16x6y3");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(40,28), "G16x6y3");
    check_base_class_offset(lv, (E16x6*), ABISELECT(16,8), "G16x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G16x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x6y3.ff");
    test_class_info(&lv, &cd_G16x6y3);
    dp->~G16x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y3(Test_G16x6y3, "G16x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G16x6y3C1Ev();
extern void _ZN7G16x6y3D1Ev();
Name_Map name_map_G16x6y3[] = {
  NSPAIR(_ZN7G16x6y3C1Ev),
  NSPAIR(_ZN7G16x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y3[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x6y3[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G16x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y3[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y3[] = {
  {&(_ZTV7G16x6y3[5]),  5,14},
  {&(_ZTV7G16x6y3[9]),  9,14},
  {&(_ZTV7G16x6y3[13]),  13,14},
  {&(_tg__ZTV5E16x6__7G16x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y3[];
extern  VTBL_ENTRY _ZTV7G16x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y3[];
Class_Descriptor cd_G16x6y3 = {  "G16x6y3", // class name
  bases_G16x6y3, 6,
  &(vtc_G16x6y3[0]), // expected_vtbl_contents
  &(vtt_G16x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G16x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y3),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y4  : E16x6 , F0 {
  int ff;
  ~G16x6y4(); // tgen
  G16x6y4(); // tgen
};
//SIG(1 G16x6y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G16x6y4 ::~G16x6y4(){ note_dtor("G16x6y4", this);} // tgen
G16x6y4 ::G16x6y4(){ note_ctor("G16x6y4", this);} // tgen

static void Test_G16x6y4()
{
  extern Class_Descriptor cd_G16x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x6y4, buf);
    G16x6y4 *dp, &lv = *(dp=new (buf) G16x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y4)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(8,4), "G16x6y4");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(12,8), "G16x6y4");
    check_base_class_offset(lv, (C16*)(E16x6*), 0, "G16x6y4");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(32,28), "G16x6y4");
    check_base_class_offset(lv, (E16x6*), 0, "G16x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G16x6y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G16x6y4.ff");
    test_class_info(&lv, &cd_G16x6y4);
    dp->~G16x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y4(Test_G16x6y4, "G16x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G16x6y4C1Ev();
extern void _ZN7G16x6y4D1Ev();
Name_Map name_map_G16x6y4[] = {
  NSPAIR(_ZN7G16x6y4C1Ev),
  NSPAIR(_ZN7G16x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y4[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y4[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y4[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y4[] = {
  {&(_ZTV7G16x6y4[3]),  3,4},
  {&(_tg__ZTV5E16x6__7G16x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y4[];
extern  VTBL_ENTRY _ZTV7G16x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y4[];
Class_Descriptor cd_G16x6y4 = {  "G16x6y4", // class name
  bases_G16x6y4, 6,
  &(vtc_G16x6y4[0]), // expected_vtbl_contents
  &(vtt_G16x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G16x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y4),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y5  : virtual E16x6 , F0 {
  int ff;
  ~G16x6y5(); // tgen
  G16x6y5(); // tgen
};
//SIG(1 G16x6y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G16x6y5 ::~G16x6y5(){ note_dtor("G16x6y5", this);} // tgen
G16x6y5 ::G16x6y5(){ note_ctor("G16x6y5", this);} // tgen

static void Test_G16x6y5()
{
  extern Class_Descriptor cd_G16x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x6y5, buf);
    G16x6y5 *dp, &lv = *(dp=new (buf) G16x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y5)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(24,16), "G16x6y5");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(28,20), "G16x6y5");
    check_base_class_offset(lv, (C16*)(E16x6*), ABISELECT(16,12), "G16x6y5");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(40,32), "G16x6y5");
    check_base_class_offset(lv, (E16x6*), ABISELECT(16,12), "G16x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x6y5.ff");
    test_class_info(&lv, &cd_G16x6y5);
    dp->~G16x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y5(Test_G16x6y5, "G16x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x6y5C1Ev();
extern void _ZN7G16x6y5D1Ev();
Name_Map name_map_G16x6y5[] = {
  NSPAIR(_ZN7G16x6y5C1Ev),
  NSPAIR(_ZN7G16x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y5[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x6y5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y5[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y5[] = {
  {&(_ZTV7G16x6y5[4]),  4,9},
  {&(_ZTV7G16x6y5[8]),  8,9},
  {&(_tg__ZTV5E16x6__7G16x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y5[];
extern  VTBL_ENTRY _ZTV7G16x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y5[];
Class_Descriptor cd_G16x6y5 = {  "G16x6y5", // class name
  bases_G16x6y5, 6,
  &(vtc_G16x6y5[0]), // expected_vtbl_contents
  &(vtt_G16x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y5),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y6  : E16x6 , virtual F0 {
  int ff;
  ~G16x6y6(); // tgen
  G16x6y6(); // tgen
};
//SIG(1 G16x6y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x6y6 ::~G16x6y6(){ note_dtor("G16x6y6", this);} // tgen
G16x6y6 ::G16x6y6(){ note_ctor("G16x6y6", this);} // tgen

static void Test_G16x6y6()
{
  extern Class_Descriptor cd_G16x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G16x6y6, buf);
    G16x6y6 *dp, &lv = *(dp=new (buf) G16x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G16x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y6)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(8,4), "G16x6y6");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(12,8), "G16x6y6");
    check_base_class_offset(lv, (C16*)(E16x6*), 0, "G16x6y6");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(28,24), "G16x6y6");
    check_base_class_offset(lv, (E16x6*), 0, "G16x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G16x6y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G16x6y6.ff");
    test_class_info(&lv, &cd_G16x6y6);
    dp->~G16x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y6(Test_G16x6y6, "G16x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G16x6y6C1Ev();
extern void _ZN7G16x6y6D1Ev();
Name_Map name_map_G16x6y6[] = {
  NSPAIR(_ZN7G16x6y6C1Ev),
  NSPAIR(_ZN7G16x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y6[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y6[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y6[] = {
  {&(_ZTV7G16x6y6[4]),  4,5},
  {&(_tg__ZTV5E16x6__7G16x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y6[];
extern  VTBL_ENTRY _ZTV7G16x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y6[];
Class_Descriptor cd_G16x6y6 = {  "G16x6y6", // class name
  bases_G16x6y6, 6,
  &(vtc_G16x6y6[0]), // expected_vtbl_contents
  &(vtt_G16x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G16x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y6),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x6y7  : virtual E16x6 , virtual F0 {
  int ff;
  ~G16x6y7(); // tgen
  G16x6y7(); // tgen
};
//SIG(1 G16x6y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x6y7 ::~G16x6y7(){ note_dtor("G16x6y7", this);} // tgen
G16x6y7 ::G16x6y7(){ note_ctor("G16x6y7", this);} // tgen

static void Test_G16x6y7()
{
  extern Class_Descriptor cd_G16x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x6y7, buf);
    G16x6y7 *dp, &lv = *(dp=new (buf) G16x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x6y7)");
    check_base_class_offset(lv, (A0*)(C16*)(E16x6*), ABISELECT(24,12), "G16x6y7");
    check_base_class_offset(lv, (B0*)(C16*)(E16x6*), ABISELECT(28,16), "G16x6y7");
    check_base_class_offset(lv, (C16*)(E16x6*), ABISELECT(16,8), "G16x6y7");
    check_base_class_offset(lv, (D0*)(E16x6*), ABISELECT(40,28), "G16x6y7");
    check_base_class_offset(lv, (E16x6*), ABISELECT(16,8), "G16x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G16x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x6y7.ff");
    test_class_info(&lv, &cd_G16x6y7);
    dp->~G16x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x6y7(Test_G16x6y7, "G16x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x6y7C1Ev();
extern void _ZN7G16x6y7D1Ev();
Name_Map name_map_G16x6y7[] = {
  NSPAIR(_ZN7G16x6y7C1Ev),
  NSPAIR(_ZN7G16x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x6;
extern VTBL_ENTRY _ZTI5E16x6[];
extern  VTBL_ENTRY _ZTV5E16x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x6y7[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x6y7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x6y7[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV5E16x6__7G16x6y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x6y7[] = {
  {&(_ZTV7G16x6y7[5]),  5,10},
  {&(_ZTV7G16x6y7[9]),  9,10},
  {&(_tg__ZTV5E16x6__7G16x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x6y7[];
extern  VTBL_ENTRY _ZTV7G16x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x6y7[];
Class_Descriptor cd_G16x6y7 = {  "G16x6y7", // class name
  bases_G16x6y7, 6,
  &(vtc_G16x6y7[0]), // expected_vtbl_contents
  &(vtt_G16x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x6y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x6y7),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E17x6  : C17 , virtual D0 {
  int fd;
  ~E17x6(); // tgen
  E17x6(); // tgen
};
//SIG(-1 E17x6) C1{ BC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E17x6 ::~E17x6(){ note_dtor("E17x6", this);} // tgen
E17x6 ::E17x6(){ note_ctor("E17x6", this);} // tgen

static void Test_E17x6()
{
  extern Class_Descriptor cd_E17x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E17x6, buf);
    E17x6 *dp, &lv = *(dp=new (buf) E17x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E17x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x6)");
    check_base_class_offset(lv, (A1*)(C17*), 0, "E17x6");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(12,8), "E17x6");
    check_base_class_offset(lv, (C17*), 0, "E17x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E17x6");
    check_field_offset(lv, fd, ABISELECT(20,16), "E17x6.fd");
    test_class_info(&lv, &cd_E17x6);
    dp->~E17x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x6(Test_E17x6, "E17x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E17x6C1Ev();
extern void _ZN5E17x6D1Ev();
Name_Map name_map_E17x6[] = {
  NSPAIR(_ZN5E17x6C1Ev),
  NSPAIR(_ZN5E17x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E17x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E17x6[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_E17x6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV5E17x6[];
static  VTT_ENTRY vtt_E17x6[] = {
  {&(_ZTV5E17x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
Class_Descriptor cd_E17x6 = {  "E17x6", // class name
  bases_E17x6, 4,
  &(vtc_E17x6[0]), // expected_vtbl_contents
  &(vtt_E17x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E17x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E17x6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E17x6),1, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y0  : E17x6 , F1 {
  int ff;
  ~G17x6y0(); // tgen
  G17x6y0(); // tgen
};
//SIG(1 G17x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x6y0 ::~G17x6y0(){ note_dtor("G17x6y0", this);} // tgen
G17x6y0 ::G17x6y0(){ note_ctor("G17x6y0", this);} // tgen

static void Test_G17x6y0()
{
  extern Class_Descriptor cd_G17x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x6y0, buf);
    G17x6y0 *dp, &lv = *(dp=new (buf) G17x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y0)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), 0, "G17x6y0");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(12,8), "G17x6y0");
    check_base_class_offset(lv, (C17*)(E17x6*), 0, "G17x6y0");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(40,32), "G17x6y0");
    check_base_class_offset(lv, (E17x6*), 0, "G17x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G17x6y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G17x6y0.ff");
    test_class_info(&lv, &cd_G17x6y0);
    dp->~G17x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y0(Test_G17x6y0, "G17x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x6y0C1Ev();
extern void _ZN7G17x6y0D1Ev();
Name_Map name_map_G17x6y0[] = {
  NSPAIR(_ZN7G17x6y0C1Ev),
  NSPAIR(_ZN7G17x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y0[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y0[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G17x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y0[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y0[] = {
  {&(_ZTV7G17x6y0[3]),  3,7},
  {&(_tg__ZTV5E17x6__7G17x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y0[];
extern  VTBL_ENTRY _ZTV7G17x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y0[];
Class_Descriptor cd_G17x6y0 = {  "G17x6y0", // class name
  bases_G17x6y0, 6,
  &(vtc_G17x6y0[0]), // expected_vtbl_contents
  &(vtt_G17x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y0),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y1  : virtual E17x6 , F1 {
  int ff;
  ~G17x6y1(); // tgen
  G17x6y1(); // tgen
};
//SIG(1 G17x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x6y1 ::~G17x6y1(){ note_dtor("G17x6y1", this);} // tgen
G17x6y1 ::G17x6y1(){ note_ctor("G17x6y1", this);} // tgen

static void Test_G17x6y1()
{
  extern Class_Descriptor cd_G17x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x6y1, buf);
    G17x6y1 *dp, &lv = *(dp=new (buf) G17x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y1)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), ABISELECT(16,12), "G17x6y1");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(28,20), "G17x6y1");
    check_base_class_offset(lv, (C17*)(E17x6*), ABISELECT(16,12), "G17x6y1");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(40,32), "G17x6y1");
    check_base_class_offset(lv, (E17x6*), ABISELECT(16,12), "G17x6y1");
    check_base_class_offset(lv, (F1*), 0, "G17x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x6y1.ff");
    test_class_info(&lv, &cd_G17x6y1);
    dp->~G17x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y1(Test_G17x6y1, "G17x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x6y1C1Ev();
extern void _ZN7G17x6y1D1Ev();
Name_Map name_map_G17x6y1[] = {
  NSPAIR(_ZN7G17x6y1C1Ev),
  NSPAIR(_ZN7G17x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x6y1[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y1[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y1[] = {
  {&(_ZTV7G17x6y1[4]),  4,10},
  {&(_ZTV7G17x6y1[9]),  9,10},
  {&(_tg__ZTV5E17x6__7G17x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y1[];
extern  VTBL_ENTRY _ZTV7G17x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y1[];
Class_Descriptor cd_G17x6y1 = {  "G17x6y1", // class name
  bases_G17x6y1, 6,
  &(vtc_G17x6y1[0]), // expected_vtbl_contents
  &(vtt_G17x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y1),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y2  : E17x6 , virtual F1 {
  int ff;
  ~G17x6y2(); // tgen
  G17x6y2(); // tgen
};
//SIG(1 G17x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x6y2 ::~G17x6y2(){ note_dtor("G17x6y2", this);} // tgen
G17x6y2 ::G17x6y2(){ note_ctor("G17x6y2", this);} // tgen

static void Test_G17x6y2()
{
  extern Class_Descriptor cd_G17x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x6y2, buf);
    G17x6y2 *dp, &lv = *(dp=new (buf) G17x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y2)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), 0, "G17x6y2");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(12,8), "G17x6y2");
    check_base_class_offset(lv, (C17*)(E17x6*), 0, "G17x6y2");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(28,24), "G17x6y2");
    check_base_class_offset(lv, (E17x6*), 0, "G17x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G17x6y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G17x6y2.ff");
    test_class_info(&lv, &cd_G17x6y2);
    dp->~G17x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y2(Test_G17x6y2, "G17x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x6y2C1Ev();
extern void _ZN7G17x6y2D1Ev();
Name_Map name_map_G17x6y2[] = {
  NSPAIR(_ZN7G17x6y2C1Ev),
  NSPAIR(_ZN7G17x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y2[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y2[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G17x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y2[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y2[] = {
  {&(_ZTV7G17x6y2[4]),  4,9},
  {&(_tg__ZTV5E17x6__7G17x6y2[3]),  3,4},
  {&(_ZTV7G17x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G17x6y2[];
extern  VTBL_ENTRY _ZTV7G17x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y2[];
Class_Descriptor cd_G17x6y2 = {  "G17x6y2", // class name
  bases_G17x6y2, 6,
  &(vtc_G17x6y2[0]), // expected_vtbl_contents
  &(vtt_G17x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y2),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y3  : virtual E17x6 , virtual F1 {
  int ff;
  ~G17x6y3(); // tgen
  G17x6y3(); // tgen
};
//SIG(1 G17x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x6y3 ::~G17x6y3(){ note_dtor("G17x6y3", this);} // tgen
G17x6y3 ::G17x6y3(){ note_ctor("G17x6y3", this);} // tgen

static void Test_G17x6y3()
{
  extern Class_Descriptor cd_G17x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x6y3, buf);
    G17x6y3 *dp, &lv = *(dp=new (buf) G17x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y3)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), ABISELECT(16,8), "G17x6y3");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(28,16), "G17x6y3");
    check_base_class_offset(lv, (C17*)(E17x6*), ABISELECT(16,8), "G17x6y3");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(40,28), "G17x6y3");
    check_base_class_offset(lv, (E17x6*), ABISELECT(16,8), "G17x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G17x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x6y3.ff");
    test_class_info(&lv, &cd_G17x6y3);
    dp->~G17x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y3(Test_G17x6y3, "G17x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G17x6y3C1Ev();
extern void _ZN7G17x6y3D1Ev();
Name_Map name_map_G17x6y3[] = {
  NSPAIR(_ZN7G17x6y3C1Ev),
  NSPAIR(_ZN7G17x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y3[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x6y3[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G17x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y3[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y3[] = {
  {&(_ZTV7G17x6y3[5]),  5,14},
  {&(_ZTV7G17x6y3[9]),  9,14},
  {&(_ZTV7G17x6y3[13]),  13,14},
  {&(_tg__ZTV5E17x6__7G17x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y3[];
extern  VTBL_ENTRY _ZTV7G17x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y3[];
Class_Descriptor cd_G17x6y3 = {  "G17x6y3", // class name
  bases_G17x6y3, 6,
  &(vtc_G17x6y3[0]), // expected_vtbl_contents
  &(vtt_G17x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G17x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y3),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y4  : E17x6 , F0 {
  int ff;
  ~G17x6y4(); // tgen
  G17x6y4(); // tgen
};
//SIG(1 G17x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G17x6y4 ::~G17x6y4(){ note_dtor("G17x6y4", this);} // tgen
G17x6y4 ::G17x6y4(){ note_ctor("G17x6y4", this);} // tgen

static void Test_G17x6y4()
{
  extern Class_Descriptor cd_G17x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x6y4, buf);
    G17x6y4 *dp, &lv = *(dp=new (buf) G17x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y4)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), 0, "G17x6y4");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(12,8), "G17x6y4");
    check_base_class_offset(lv, (C17*)(E17x6*), 0, "G17x6y4");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(32,28), "G17x6y4");
    check_base_class_offset(lv, (E17x6*), 0, "G17x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G17x6y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G17x6y4.ff");
    test_class_info(&lv, &cd_G17x6y4);
    dp->~G17x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y4(Test_G17x6y4, "G17x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G17x6y4C1Ev();
extern void _ZN7G17x6y4D1Ev();
Name_Map name_map_G17x6y4[] = {
  NSPAIR(_ZN7G17x6y4C1Ev),
  NSPAIR(_ZN7G17x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y4[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y4[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y4[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y4[] = {
  {&(_ZTV7G17x6y4[3]),  3,4},
  {&(_tg__ZTV5E17x6__7G17x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y4[];
extern  VTBL_ENTRY _ZTV7G17x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y4[];
Class_Descriptor cd_G17x6y4 = {  "G17x6y4", // class name
  bases_G17x6y4, 6,
  &(vtc_G17x6y4[0]), // expected_vtbl_contents
  &(vtt_G17x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G17x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y4),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y5  : virtual E17x6 , F0 {
  int ff;
  ~G17x6y5(); // tgen
  G17x6y5(); // tgen
};
//SIG(1 G17x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G17x6y5 ::~G17x6y5(){ note_dtor("G17x6y5", this);} // tgen
G17x6y5 ::G17x6y5(){ note_ctor("G17x6y5", this);} // tgen

static void Test_G17x6y5()
{
  extern Class_Descriptor cd_G17x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x6y5, buf);
    G17x6y5 *dp, &lv = *(dp=new (buf) G17x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y5)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), ABISELECT(16,12), "G17x6y5");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(28,20), "G17x6y5");
    check_base_class_offset(lv, (C17*)(E17x6*), ABISELECT(16,12), "G17x6y5");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(40,32), "G17x6y5");
    check_base_class_offset(lv, (E17x6*), ABISELECT(16,12), "G17x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x6y5.ff");
    test_class_info(&lv, &cd_G17x6y5);
    dp->~G17x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y5(Test_G17x6y5, "G17x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x6y5C1Ev();
extern void _ZN7G17x6y5D1Ev();
Name_Map name_map_G17x6y5[] = {
  NSPAIR(_ZN7G17x6y5C1Ev),
  NSPAIR(_ZN7G17x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y5[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x6y5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y5[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y5[] = {
  {&(_ZTV7G17x6y5[4]),  4,9},
  {&(_ZTV7G17x6y5[8]),  8,9},
  {&(_tg__ZTV5E17x6__7G17x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y5[];
extern  VTBL_ENTRY _ZTV7G17x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y5[];
Class_Descriptor cd_G17x6y5 = {  "G17x6y5", // class name
  bases_G17x6y5, 6,
  &(vtc_G17x6y5[0]), // expected_vtbl_contents
  &(vtt_G17x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y5),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y6  : E17x6 , virtual F0 {
  int ff;
  ~G17x6y6(); // tgen
  G17x6y6(); // tgen
};
//SIG(1 G17x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x6y6 ::~G17x6y6(){ note_dtor("G17x6y6", this);} // tgen
G17x6y6 ::G17x6y6(){ note_ctor("G17x6y6", this);} // tgen

static void Test_G17x6y6()
{
  extern Class_Descriptor cd_G17x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G17x6y6, buf);
    G17x6y6 *dp, &lv = *(dp=new (buf) G17x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G17x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y6)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), 0, "G17x6y6");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(12,8), "G17x6y6");
    check_base_class_offset(lv, (C17*)(E17x6*), 0, "G17x6y6");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(28,24), "G17x6y6");
    check_base_class_offset(lv, (E17x6*), 0, "G17x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G17x6y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G17x6y6.ff");
    test_class_info(&lv, &cd_G17x6y6);
    dp->~G17x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y6(Test_G17x6y6, "G17x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G17x6y6C1Ev();
extern void _ZN7G17x6y6D1Ev();
Name_Map name_map_G17x6y6[] = {
  NSPAIR(_ZN7G17x6y6C1Ev),
  NSPAIR(_ZN7G17x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y6[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y6[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y6[] = {
  {&(_ZTV7G17x6y6[4]),  4,5},
  {&(_tg__ZTV5E17x6__7G17x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y6[];
extern  VTBL_ENTRY _ZTV7G17x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y6[];
Class_Descriptor cd_G17x6y6 = {  "G17x6y6", // class name
  bases_G17x6y6, 6,
  &(vtc_G17x6y6[0]), // expected_vtbl_contents
  &(vtt_G17x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G17x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y6),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x6y7  : virtual E17x6 , virtual F0 {
  int ff;
  ~G17x6y7(); // tgen
  G17x6y7(); // tgen
};
//SIG(1 G17x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x6y7 ::~G17x6y7(){ note_dtor("G17x6y7", this);} // tgen
G17x6y7 ::G17x6y7(){ note_ctor("G17x6y7", this);} // tgen

static void Test_G17x6y7()
{
  extern Class_Descriptor cd_G17x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x6y7, buf);
    G17x6y7 *dp, &lv = *(dp=new (buf) G17x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x6y7)");
    check_base_class_offset(lv, (A1*)(C17*)(E17x6*), ABISELECT(16,8), "G17x6y7");
    check_base_class_offset(lv, (B0*)(C17*)(E17x6*), ABISELECT(28,16), "G17x6y7");
    check_base_class_offset(lv, (C17*)(E17x6*), ABISELECT(16,8), "G17x6y7");
    check_base_class_offset(lv, (D0*)(E17x6*), ABISELECT(40,28), "G17x6y7");
    check_base_class_offset(lv, (E17x6*), ABISELECT(16,8), "G17x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G17x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x6y7.ff");
    test_class_info(&lv, &cd_G17x6y7);
    dp->~G17x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x6y7(Test_G17x6y7, "G17x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x6y7C1Ev();
extern void _ZN7G17x6y7D1Ev();
Name_Map name_map_G17x6y7[] = {
  NSPAIR(_ZN7G17x6y7C1Ev),
  NSPAIR(_ZN7G17x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x6;
extern VTBL_ENTRY _ZTI5E17x6[];
extern  VTBL_ENTRY _ZTV5E17x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x6y7[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x6y7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x6y7[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV5E17x6__7G17x6y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x6y7[] = {
  {&(_ZTV7G17x6y7[5]),  5,10},
  {&(_ZTV7G17x6y7[9]),  9,10},
  {&(_tg__ZTV5E17x6__7G17x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x6y7[];
extern  VTBL_ENTRY _ZTV7G17x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x6y7[];
Class_Descriptor cd_G17x6y7 = {  "G17x6y7", // class name
  bases_G17x6y7, 6,
  &(vtc_G17x6y7[0]), // expected_vtbl_contents
  &(vtt_G17x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x6y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x6y7),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E18x6  : C18 , virtual D0 {
  int fd;
  ~E18x6(); // tgen
  E18x6(); // tgen
};
//SIG(-1 E18x6) C1{ BC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E18x6 ::~E18x6(){ note_dtor("E18x6", this);} // tgen
E18x6 ::E18x6(){ note_ctor("E18x6", this);} // tgen

static void Test_E18x6()
{
  extern Class_Descriptor cd_E18x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E18x6, buf);
    E18x6 *dp, &lv = *(dp=new (buf) E18x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E18x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x6)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(20,16), "E18x6");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(8,4), "E18x6");
    check_base_class_offset(lv, (C18*), 0, "E18x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E18x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E18x6.fd");
    test_class_info(&lv, &cd_E18x6);
    dp->~E18x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x6(Test_E18x6, "E18x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E18x6C1Ev();
extern void _ZN5E18x6D1Ev();
Name_Map name_map_E18x6[] = {
  NSPAIR(_ZN5E18x6C1Ev),
  NSPAIR(_ZN5E18x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E18x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E18x6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_E18x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV5E18x6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x6[] = {
  {&(_ZTV5E18x6[4]),  4,5},
  {&(_tg__ZTV3C18__5E18x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
Class_Descriptor cd_E18x6 = {  "E18x6", // class name
  bases_E18x6, 4,
  &(vtc_E18x6[0]), // expected_vtbl_contents
  &(vtt_E18x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E18x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E18x6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E18x6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y0  : E18x6 , F1 {
  int ff;
  ~G18x6y0(); // tgen
  G18x6y0(); // tgen
};
//SIG(1 G18x6y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x6y0 ::~G18x6y0(){ note_dtor("G18x6y0", this);} // tgen
G18x6y0 ::G18x6y0(){ note_ctor("G18x6y0", this);} // tgen

static void Test_G18x6y0()
{
  extern Class_Descriptor cd_G18x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x6y0, buf);
    G18x6y0 *dp, &lv = *(dp=new (buf) G18x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y0)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(40,28), "G18x6y0");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(8,4), "G18x6y0");
    check_base_class_offset(lv, (C18*)(E18x6*), 0, "G18x6y0");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(44,32), "G18x6y0");
    check_base_class_offset(lv, (E18x6*), 0, "G18x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G18x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G18x6y0.ff");
    test_class_info(&lv, &cd_G18x6y0);
    dp->~G18x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y0(Test_G18x6y0, "G18x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x6y0C1Ev();
extern void _ZN7G18x6y0D1Ev();
Name_Map name_map_G18x6y0[] = {
  NSPAIR(_ZN7G18x6y0C1Ev),
  NSPAIR(_ZN7G18x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y0[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y0[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G18x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y0[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y0[] = {
  {&(_ZTV7G18x6y0[4]),  4,8},
  {&(_tg__ZTV5E18x6__7G18x6y0[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y0[];
extern  VTBL_ENTRY _ZTV7G18x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y0[];
Class_Descriptor cd_G18x6y0 = {  "G18x6y0", // class name
  bases_G18x6y0, 6,
  &(vtc_G18x6y0[0]), // expected_vtbl_contents
  &(vtt_G18x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y1  : virtual E18x6 , F1 {
  int ff;
  ~G18x6y1(); // tgen
  G18x6y1(); // tgen
};
//SIG(1 G18x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x6y1 ::~G18x6y1(){ note_dtor("G18x6y1", this);} // tgen
G18x6y1 ::G18x6y1(){ note_ctor("G18x6y1", this);} // tgen

static void Test_G18x6y1()
{
  extern Class_Descriptor cd_G18x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x6y1, buf);
    G18x6y1 *dp, &lv = *(dp=new (buf) G18x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y1)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(36,28), "G18x6y1");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(24,16), "G18x6y1");
    check_base_class_offset(lv, (C18*)(E18x6*), ABISELECT(16,12), "G18x6y1");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(40,32), "G18x6y1");
    check_base_class_offset(lv, (E18x6*), ABISELECT(16,12), "G18x6y1");
    check_base_class_offset(lv, (F1*), 0, "G18x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x6y1.ff");
    test_class_info(&lv, &cd_G18x6y1);
    dp->~G18x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y1(Test_G18x6y1, "G18x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x6y1C1Ev();
extern void _ZN7G18x6y1D1Ev();
Name_Map name_map_G18x6y1[] = {
  NSPAIR(_ZN7G18x6y1C1Ev),
  NSPAIR(_ZN7G18x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x6y1[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y1[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y1[] = {
  {&(_ZTV7G18x6y1[5]),  5,12},
  {&(_ZTV7G18x6y1[11]),  11,12},
  {&(_tg__ZTV5E18x6__7G18x6y1[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y1[];
extern  VTBL_ENTRY _ZTV7G18x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y1[];
Class_Descriptor cd_G18x6y1 = {  "G18x6y1", // class name
  bases_G18x6y1, 6,
  &(vtc_G18x6y1[0]), // expected_vtbl_contents
  &(vtt_G18x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y2  : E18x6 , virtual F1 {
  int ff;
  ~G18x6y2(); // tgen
  G18x6y2(); // tgen
};
//SIG(1 G18x6y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x6y2 ::~G18x6y2(){ note_dtor("G18x6y2", this);} // tgen
G18x6y2 ::G18x6y2(){ note_ctor("G18x6y2", this);} // tgen

static void Test_G18x6y2()
{
  extern Class_Descriptor cd_G18x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x6y2, buf);
    G18x6y2 *dp, &lv = *(dp=new (buf) G18x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y2)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(24,20), "G18x6y2");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(8,4), "G18x6y2");
    check_base_class_offset(lv, (C18*)(E18x6*), 0, "G18x6y2");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(28,24), "G18x6y2");
    check_base_class_offset(lv, (E18x6*), 0, "G18x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G18x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G18x6y2.ff");
    test_class_info(&lv, &cd_G18x6y2);
    dp->~G18x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y2(Test_G18x6y2, "G18x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x6y2C1Ev();
extern void _ZN7G18x6y2D1Ev();
Name_Map name_map_G18x6y2[] = {
  NSPAIR(_ZN7G18x6y2C1Ev),
  NSPAIR(_ZN7G18x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y2[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y2[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G18x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y2[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y2[] = {
  {&(_ZTV7G18x6y2[5]),  5,10},
  {&(_tg__ZTV5E18x6__7G18x6y2[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y2[3]),  3,4},
  {&(_ZTV7G18x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G18x6y2[];
extern  VTBL_ENTRY _ZTV7G18x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y2[];
Class_Descriptor cd_G18x6y2 = {  "G18x6y2", // class name
  bases_G18x6y2, 6,
  &(vtc_G18x6y2[0]), // expected_vtbl_contents
  &(vtt_G18x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y3  : virtual E18x6 , virtual F1 {
  int ff;
  ~G18x6y3(); // tgen
  G18x6y3(); // tgen
};
//SIG(1 G18x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x6y3 ::~G18x6y3(){ note_dtor("G18x6y3", this);} // tgen
G18x6y3 ::G18x6y3(){ note_ctor("G18x6y3", this);} // tgen

static void Test_G18x6y3()
{
  extern Class_Descriptor cd_G18x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x6y3, buf);
    G18x6y3 *dp, &lv = *(dp=new (buf) G18x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y3)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(36,24), "G18x6y3");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(24,12), "G18x6y3");
    check_base_class_offset(lv, (C18*)(E18x6*), ABISELECT(16,8), "G18x6y3");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(40,28), "G18x6y3");
    check_base_class_offset(lv, (E18x6*), ABISELECT(16,8), "G18x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G18x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x6y3.ff");
    test_class_info(&lv, &cd_G18x6y3);
    dp->~G18x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y3(Test_G18x6y3, "G18x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G18x6y3C1Ev();
extern void _ZN7G18x6y3D1Ev();
Name_Map name_map_G18x6y3[] = {
  NSPAIR(_ZN7G18x6y3C1Ev),
  NSPAIR(_ZN7G18x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y3[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x6y3[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G18x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y3[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y3[] = {
  {&(_ZTV7G18x6y3[6]),  6,16},
  {&(_ZTV7G18x6y3[11]),  11,16},
  {&(_ZTV7G18x6y3[15]),  15,16},
  {&(_tg__ZTV5E18x6__7G18x6y3[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y3[];
extern  VTBL_ENTRY _ZTV7G18x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y3[];
Class_Descriptor cd_G18x6y3 = {  "G18x6y3", // class name
  bases_G18x6y3, 6,
  &(vtc_G18x6y3[0]), // expected_vtbl_contents
  &(vtt_G18x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G18x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y4  : E18x6 , F0 {
  int ff;
  ~G18x6y4(); // tgen
  G18x6y4(); // tgen
};
//SIG(1 G18x6y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G18x6y4 ::~G18x6y4(){ note_dtor("G18x6y4", this);} // tgen
G18x6y4 ::G18x6y4(){ note_ctor("G18x6y4", this);} // tgen

static void Test_G18x6y4()
{
  extern Class_Descriptor cd_G18x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x6y4, buf);
    G18x6y4 *dp, &lv = *(dp=new (buf) G18x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y4)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(28,24), "G18x6y4");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(8,4), "G18x6y4");
    check_base_class_offset(lv, (C18*)(E18x6*), 0, "G18x6y4");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(32,28), "G18x6y4");
    check_base_class_offset(lv, (E18x6*), 0, "G18x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G18x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G18x6y4.ff");
    test_class_info(&lv, &cd_G18x6y4);
    dp->~G18x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y4(Test_G18x6y4, "G18x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G18x6y4C1Ev();
extern void _ZN7G18x6y4D1Ev();
Name_Map name_map_G18x6y4[] = {
  NSPAIR(_ZN7G18x6y4C1Ev),
  NSPAIR(_ZN7G18x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y4[] = {
  {&(_ZTV7G18x6y4[4]),  4,5},
  {&(_tg__ZTV5E18x6__7G18x6y4[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y4[];
extern  VTBL_ENTRY _ZTV7G18x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y4[];
Class_Descriptor cd_G18x6y4 = {  "G18x6y4", // class name
  bases_G18x6y4, 6,
  &(vtc_G18x6y4[0]), // expected_vtbl_contents
  &(vtt_G18x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G18x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y5  : virtual E18x6 , F0 {
  int ff;
  ~G18x6y5(); // tgen
  G18x6y5(); // tgen
};
//SIG(1 G18x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G18x6y5 ::~G18x6y5(){ note_dtor("G18x6y5", this);} // tgen
G18x6y5 ::G18x6y5(){ note_ctor("G18x6y5", this);} // tgen

static void Test_G18x6y5()
{
  extern Class_Descriptor cd_G18x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x6y5, buf);
    G18x6y5 *dp, &lv = *(dp=new (buf) G18x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y5)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(36,28), "G18x6y5");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(24,16), "G18x6y5");
    check_base_class_offset(lv, (C18*)(E18x6*), ABISELECT(16,12), "G18x6y5");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(40,32), "G18x6y5");
    check_base_class_offset(lv, (E18x6*), ABISELECT(16,12), "G18x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x6y5.ff");
    test_class_info(&lv, &cd_G18x6y5);
    dp->~G18x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y5(Test_G18x6y5, "G18x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x6y5C1Ev();
extern void _ZN7G18x6y5D1Ev();
Name_Map name_map_G18x6y5[] = {
  NSPAIR(_ZN7G18x6y5C1Ev),
  NSPAIR(_ZN7G18x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x6y5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y5[] = {
  {&(_ZTV7G18x6y5[5]),  5,11},
  {&(_ZTV7G18x6y5[10]),  10,11},
  {&(_tg__ZTV5E18x6__7G18x6y5[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y5[];
extern  VTBL_ENTRY _ZTV7G18x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y5[];
Class_Descriptor cd_G18x6y5 = {  "G18x6y5", // class name
  bases_G18x6y5, 6,
  &(vtc_G18x6y5[0]), // expected_vtbl_contents
  &(vtt_G18x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y6  : E18x6 , virtual F0 {
  int ff;
  ~G18x6y6(); // tgen
  G18x6y6(); // tgen
};
//SIG(1 G18x6y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x6y6 ::~G18x6y6(){ note_dtor("G18x6y6", this);} // tgen
G18x6y6 ::G18x6y6(){ note_ctor("G18x6y6", this);} // tgen

static void Test_G18x6y6()
{
  extern Class_Descriptor cd_G18x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G18x6y6, buf);
    G18x6y6 *dp, &lv = *(dp=new (buf) G18x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G18x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y6)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(24,20), "G18x6y6");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(8,4), "G18x6y6");
    check_base_class_offset(lv, (C18*)(E18x6*), 0, "G18x6y6");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(28,24), "G18x6y6");
    check_base_class_offset(lv, (E18x6*), 0, "G18x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G18x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G18x6y6.ff");
    test_class_info(&lv, &cd_G18x6y6);
    dp->~G18x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y6(Test_G18x6y6, "G18x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G18x6y6C1Ev();
extern void _ZN7G18x6y6D1Ev();
Name_Map name_map_G18x6y6[] = {
  NSPAIR(_ZN7G18x6y6C1Ev),
  NSPAIR(_ZN7G18x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y6[] = {
  {&(_ZTV7G18x6y6[5]),  5,6},
  {&(_tg__ZTV5E18x6__7G18x6y6[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y6[];
extern  VTBL_ENTRY _ZTV7G18x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y6[];
Class_Descriptor cd_G18x6y6 = {  "G18x6y6", // class name
  bases_G18x6y6, 6,
  &(vtc_G18x6y6[0]), // expected_vtbl_contents
  &(vtt_G18x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G18x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x6y7  : virtual E18x6 , virtual F0 {
  int ff;
  ~G18x6y7(); // tgen
  G18x6y7(); // tgen
};
//SIG(1 G18x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x6y7 ::~G18x6y7(){ note_dtor("G18x6y7", this);} // tgen
G18x6y7 ::G18x6y7(){ note_ctor("G18x6y7", this);} // tgen

static void Test_G18x6y7()
{
  extern Class_Descriptor cd_G18x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x6y7, buf);
    G18x6y7 *dp, &lv = *(dp=new (buf) G18x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x6y7)");
    check_base_class_offset(lv, (A0*)(C18*)(E18x6*), ABISELECT(36,24), "G18x6y7");
    check_base_class_offset(lv, (B0*)(C18*)(E18x6*), ABISELECT(24,12), "G18x6y7");
    check_base_class_offset(lv, (C18*)(E18x6*), ABISELECT(16,8), "G18x6y7");
    check_base_class_offset(lv, (D0*)(E18x6*), ABISELECT(40,28), "G18x6y7");
    check_base_class_offset(lv, (E18x6*), ABISELECT(16,8), "G18x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G18x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x6y7.ff");
    test_class_info(&lv, &cd_G18x6y7);
    dp->~G18x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x6y7(Test_G18x6y7, "G18x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x6y7C1Ev();
extern void _ZN7G18x6y7D1Ev();
Name_Map name_map_G18x6y7[] = {
  NSPAIR(_ZN7G18x6y7C1Ev),
  NSPAIR(_ZN7G18x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x6;
extern VTBL_ENTRY _ZTI5E18x6[];
extern  VTBL_ENTRY _ZTV5E18x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x6y7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x6y7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x6y7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV5E18x6__7G18x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C185E18x6__7G18x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x6y7[] = {
  {&(_ZTV7G18x6y7[6]),  6,12},
  {&(_ZTV7G18x6y7[11]),  11,12},
  {&(_tg__ZTV5E18x6__7G18x6y7[4]),  4,5},
  {&(_tg__ZTV3C185E18x6__7G18x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x6y7[];
extern  VTBL_ENTRY _ZTV7G18x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x6y7[];
Class_Descriptor cd_G18x6y7 = {  "G18x6y7", // class name
  bases_G18x6y7, 6,
  &(vtc_G18x6y7[0]), // expected_vtbl_contents
  &(vtt_G18x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x6y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x6y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E19x6  : C19 , virtual D0 {
  int fd;
  ~E19x6(); // tgen
  E19x6(); // tgen
};
//SIG(-1 E19x6) C1{ BC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E19x6 ::~E19x6(){ note_dtor("E19x6", this);} // tgen
E19x6 ::E19x6(){ note_ctor("E19x6", this);} // tgen

static void Test_E19x6()
{
  extern Class_Descriptor cd_E19x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E19x6, buf);
    E19x6 *dp, &lv = *(dp=new (buf) E19x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E19x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x6)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(24,16), "E19x6");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(8,4), "E19x6");
    check_base_class_offset(lv, (C19*), 0, "E19x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E19x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E19x6.fd");
    test_class_info(&lv, &cd_E19x6);
    dp->~E19x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x6(Test_E19x6, "E19x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E19x6C1Ev();
extern void _ZN5E19x6D1Ev();
Name_Map name_map_E19x6[] = {
  NSPAIR(_ZN5E19x6C1Ev),
  NSPAIR(_ZN5E19x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E19x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E19x6[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV5E19x6[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__5E19x6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x6[] = {
  {&(_ZTV5E19x6[4]),  4,9},
  {&(_tg__ZTV3C19__5E19x6[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__5E19x6[3]),  3,4},
  {&(_ZTV5E19x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
static VTBL_ENTRY alt_thunk_names134[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x6 = {  "E19x6", // class name
  bases_E19x6, 4,
  &(vtc_E19x6[0]), // expected_vtbl_contents
  &(vtt_E19x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E19x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E19x6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E19x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names134,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y0  : E19x6 , F1 {
  int ff;
  ~G19x6y0(); // tgen
  G19x6y0(); // tgen
};
//SIG(1 G19x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x6y0 ::~G19x6y0(){ note_dtor("G19x6y0", this);} // tgen
G19x6y0 ::G19x6y0(){ note_ctor("G19x6y0", this);} // tgen

static void Test_G19x6y0()
{
  extern Class_Descriptor cd_G19x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x6y0, buf);
    G19x6y0 *dp, &lv = *(dp=new (buf) G19x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y0)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(40,28), "G19x6y0");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(8,4), "G19x6y0");
    check_base_class_offset(lv, (C19*)(E19x6*), 0, "G19x6y0");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(52,36), "G19x6y0");
    check_base_class_offset(lv, (E19x6*), 0, "G19x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G19x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G19x6y0.ff");
    test_class_info(&lv, &cd_G19x6y0);
    dp->~G19x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y0(Test_G19x6y0, "G19x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x6y0C1Ev();
extern void _ZN7G19x6y0D1Ev();
Name_Map name_map_G19x6y0[] = {
  NSPAIR(_ZN7G19x6y0C1Ev),
  NSPAIR(_ZN7G19x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y0[];
extern void _ZN3C193fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y0[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G19x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x6y0[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y0[] = {
  {&(_ZTV7G19x6y0[4]),  4,12},
  {&(_tg__ZTV5E19x6__7G19x6y0[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y0[3]),  3,4},
  {&(_ZTV7G19x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G19x6y0[];
extern  VTBL_ENTRY _ZTV7G19x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y0[];
static VTBL_ENTRY alt_thunk_names135[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C193fooEv,_ZThn28_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y0 = {  "G19x6y0", // class name
  bases_G19x6y0, 6,
  &(vtc_G19x6y0[0]), // expected_vtbl_contents
  &(vtt_G19x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names135,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y1  : virtual E19x6 , F1 {
  int ff;
  ~G19x6y1(); // tgen
  G19x6y1(); // tgen
};
//SIG(1 G19x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x6y1 ::~G19x6y1(){ note_dtor("G19x6y1", this);} // tgen
G19x6y1 ::G19x6y1(){ note_ctor("G19x6y1", this);} // tgen

static void Test_G19x6y1()
{
  extern Class_Descriptor cd_G19x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x6y1, buf);
    G19x6y1 *dp, &lv = *(dp=new (buf) G19x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y1)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(40,28), "G19x6y1");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(24,16), "G19x6y1");
    check_base_class_offset(lv, (C19*)(E19x6*), ABISELECT(16,12), "G19x6y1");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(52,36), "G19x6y1");
    check_base_class_offset(lv, (E19x6*), ABISELECT(16,12), "G19x6y1");
    check_base_class_offset(lv, (F1*), 0, "G19x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x6y1.ff");
    test_class_info(&lv, &cd_G19x6y1);
    dp->~G19x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y1(Test_G19x6y1, "G19x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x6y1C1Ev();
extern void _ZN7G19x6y1D1Ev();
Name_Map name_map_G19x6y1[] = {
  NSPAIR(_ZN7G19x6y1C1Ev),
  NSPAIR(_ZN7G19x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x6y1[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x6y1[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y1[] = {
  {&(_ZTV7G19x6y1[5]),  5,16},
  {&(_ZTV7G19x6y1[11]),  11,16},
  {&(_ZTV7G19x6y1[15]),  15,16},
  {&(_tg__ZTV5E19x6__7G19x6y1[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x6y1[];
extern  VTBL_ENTRY _ZTV7G19x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y1[];
static VTBL_ENTRY alt_thunk_names136[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y1 = {  "G19x6y1", // class name
  bases_G19x6y1, 6,
  &(vtc_G19x6y1[0]), // expected_vtbl_contents
  &(vtt_G19x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names136,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y2  : E19x6 , virtual F1 {
  int ff;
  ~G19x6y2(); // tgen
  G19x6y2(); // tgen
};
//SIG(1 G19x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x6y2 ::~G19x6y2(){ note_dtor("G19x6y2", this);} // tgen
G19x6y2 ::G19x6y2(){ note_ctor("G19x6y2", this);} // tgen

static void Test_G19x6y2()
{
  extern Class_Descriptor cd_G19x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x6y2, buf);
    G19x6y2 *dp, &lv = *(dp=new (buf) G19x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y2)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(24,20), "G19x6y2");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(8,4), "G19x6y2");
    check_base_class_offset(lv, (C19*)(E19x6*), 0, "G19x6y2");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(36,28), "G19x6y2");
    check_base_class_offset(lv, (E19x6*), 0, "G19x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G19x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G19x6y2.ff");
    test_class_info(&lv, &cd_G19x6y2);
    dp->~G19x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y2(Test_G19x6y2, "G19x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x6y2C1Ev();
extern void _ZN7G19x6y2D1Ev();
Name_Map name_map_G19x6y2[] = {
  NSPAIR(_ZN7G19x6y2C1Ev),
  NSPAIR(_ZN7G19x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y2[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y2[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G19x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G19x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x6y2[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y2[] = {
  {&(_ZTV7G19x6y2[5]),  5,14},
  {&(_tg__ZTV5E19x6__7G19x6y2[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y2[3]),  3,4},
  {&(_ZTV7G19x6y2[9]),  9,14},
  {&(_ZTV7G19x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G19x6y2[];
extern  VTBL_ENTRY _ZTV7G19x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y2[];
static VTBL_ENTRY alt_thunk_names137[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y2 = {  "G19x6y2", // class name
  bases_G19x6y2, 6,
  &(vtc_G19x6y2[0]), // expected_vtbl_contents
  &(vtt_G19x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names137,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y3  : virtual E19x6 , virtual F1 {
  int ff;
  ~G19x6y3(); // tgen
  G19x6y3(); // tgen
};
//SIG(1 G19x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x6y3 ::~G19x6y3(){ note_dtor("G19x6y3", this);} // tgen
G19x6y3 ::G19x6y3(){ note_ctor("G19x6y3", this);} // tgen

static void Test_G19x6y3()
{
  extern Class_Descriptor cd_G19x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x6y3, buf);
    G19x6y3 *dp, &lv = *(dp=new (buf) G19x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y3)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(40,24), "G19x6y3");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(24,12), "G19x6y3");
    check_base_class_offset(lv, (C19*)(E19x6*), ABISELECT(16,8), "G19x6y3");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(52,32), "G19x6y3");
    check_base_class_offset(lv, (E19x6*), ABISELECT(16,8), "G19x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G19x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x6y3.ff");
    test_class_info(&lv, &cd_G19x6y3);
    dp->~G19x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y3(Test_G19x6y3, "G19x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G19x6y3C1Ev();
extern void _ZN7G19x6y3D1Ev();
Name_Map name_map_G19x6y3[] = {
  NSPAIR(_ZN7G19x6y3C1Ev),
  NSPAIR(_ZN7G19x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y3[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x6y3[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G19x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G19x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x6y3[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y3[] = {
  {&(_ZTV7G19x6y3[6]),  6,20},
  {&(_ZTV7G19x6y3[11]),  11,20},
  {&(_ZTV7G19x6y3[15]),  15,20},
  {&(_ZTV7G19x6y3[19]),  19,20},
  {&(_tg__ZTV5E19x6__7G19x6y3[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x6y3[];
extern  VTBL_ENTRY _ZTV7G19x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y3[];
static VTBL_ENTRY alt_thunk_names138[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y3 = {  "G19x6y3", // class name
  bases_G19x6y3, 6,
  &(vtc_G19x6y3[0]), // expected_vtbl_contents
  &(vtt_G19x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G19x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names138,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y4  : E19x6 , F0 {
  int ff;
  ~G19x6y4(); // tgen
  G19x6y4(); // tgen
};
//SIG(1 G19x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G19x6y4 ::~G19x6y4(){ note_dtor("G19x6y4", this);} // tgen
G19x6y4 ::G19x6y4(){ note_ctor("G19x6y4", this);} // tgen

static void Test_G19x6y4()
{
  extern Class_Descriptor cd_G19x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x6y4, buf);
    G19x6y4 *dp, &lv = *(dp=new (buf) G19x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y4)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(32,24), "G19x6y4");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(8,4), "G19x6y4");
    check_base_class_offset(lv, (C19*)(E19x6*), 0, "G19x6y4");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(44,32), "G19x6y4");
    check_base_class_offset(lv, (E19x6*), 0, "G19x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G19x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G19x6y4.ff");
    test_class_info(&lv, &cd_G19x6y4);
    dp->~G19x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y4(Test_G19x6y4, "G19x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G19x6y4C1Ev();
extern void _ZN7G19x6y4D1Ev();
Name_Map name_map_G19x6y4[] = {
  NSPAIR(_ZN7G19x6y4C1Ev),
  NSPAIR(_ZN7G19x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y4[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x6y4[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y4[] = {
  {&(_ZTV7G19x6y4[4]),  4,9},
  {&(_tg__ZTV5E19x6__7G19x6y4[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y4[3]),  3,4},
  {&(_ZTV7G19x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G19x6y4[];
extern  VTBL_ENTRY _ZTV7G19x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y4[];
static VTBL_ENTRY alt_thunk_names139[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C193fooEv,_ZThn24_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y4 = {  "G19x6y4", // class name
  bases_G19x6y4, 6,
  &(vtc_G19x6y4[0]), // expected_vtbl_contents
  &(vtt_G19x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G19x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names139,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y5  : virtual E19x6 , F0 {
  int ff;
  ~G19x6y5(); // tgen
  G19x6y5(); // tgen
};
//SIG(1 G19x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G19x6y5 ::~G19x6y5(){ note_dtor("G19x6y5", this);} // tgen
G19x6y5 ::G19x6y5(){ note_ctor("G19x6y5", this);} // tgen

static void Test_G19x6y5()
{
  extern Class_Descriptor cd_G19x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x6y5, buf);
    G19x6y5 *dp, &lv = *(dp=new (buf) G19x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y5)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(40,28), "G19x6y5");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(24,16), "G19x6y5");
    check_base_class_offset(lv, (C19*)(E19x6*), ABISELECT(16,12), "G19x6y5");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(52,36), "G19x6y5");
    check_base_class_offset(lv, (E19x6*), ABISELECT(16,12), "G19x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x6y5.ff");
    test_class_info(&lv, &cd_G19x6y5);
    dp->~G19x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y5(Test_G19x6y5, "G19x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x6y5C1Ev();
extern void _ZN7G19x6y5D1Ev();
Name_Map name_map_G19x6y5[] = {
  NSPAIR(_ZN7G19x6y5C1Ev),
  NSPAIR(_ZN7G19x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y5[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x6y5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x6y5[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y5[] = {
  {&(_ZTV7G19x6y5[5]),  5,15},
  {&(_ZTV7G19x6y5[10]),  10,15},
  {&(_ZTV7G19x6y5[14]),  14,15},
  {&(_tg__ZTV5E19x6__7G19x6y5[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x6y5[];
extern  VTBL_ENTRY _ZTV7G19x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y5[];
static VTBL_ENTRY alt_thunk_names140[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y5 = {  "G19x6y5", // class name
  bases_G19x6y5, 6,
  &(vtc_G19x6y5[0]), // expected_vtbl_contents
  &(vtt_G19x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names140,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y6  : E19x6 , virtual F0 {
  int ff;
  ~G19x6y6(); // tgen
  G19x6y6(); // tgen
};
//SIG(1 G19x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x6y6 ::~G19x6y6(){ note_dtor("G19x6y6", this);} // tgen
G19x6y6 ::G19x6y6(){ note_ctor("G19x6y6", this);} // tgen

static void Test_G19x6y6()
{
  extern Class_Descriptor cd_G19x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G19x6y6, buf);
    G19x6y6 *dp, &lv = *(dp=new (buf) G19x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G19x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y6)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(24,20), "G19x6y6");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(8,4), "G19x6y6");
    check_base_class_offset(lv, (C19*)(E19x6*), 0, "G19x6y6");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(36,28), "G19x6y6");
    check_base_class_offset(lv, (E19x6*), 0, "G19x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G19x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G19x6y6.ff");
    test_class_info(&lv, &cd_G19x6y6);
    dp->~G19x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y6(Test_G19x6y6, "G19x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G19x6y6C1Ev();
extern void _ZN7G19x6y6D1Ev();
Name_Map name_map_G19x6y6[] = {
  NSPAIR(_ZN7G19x6y6C1Ev),
  NSPAIR(_ZN7G19x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y6[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G19x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x6y6[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y6[] = {
  {&(_ZTV7G19x6y6[5]),  5,10},
  {&(_tg__ZTV5E19x6__7G19x6y6[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y6[3]),  3,4},
  {&(_ZTV7G19x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G19x6y6[];
extern  VTBL_ENTRY _ZTV7G19x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y6[];
static VTBL_ENTRY alt_thunk_names141[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn20_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y6 = {  "G19x6y6", // class name
  bases_G19x6y6, 6,
  &(vtc_G19x6y6[0]), // expected_vtbl_contents
  &(vtt_G19x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G19x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names141,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x6y7  : virtual E19x6 , virtual F0 {
  int ff;
  ~G19x6y7(); // tgen
  G19x6y7(); // tgen
};
//SIG(1 G19x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x6y7 ::~G19x6y7(){ note_dtor("G19x6y7", this);} // tgen
G19x6y7 ::G19x6y7(){ note_ctor("G19x6y7", this);} // tgen

static void Test_G19x6y7()
{
  extern Class_Descriptor cd_G19x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G19x6y7, buf);
    G19x6y7 *dp, &lv = *(dp=new (buf) G19x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G19x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x6y7)");
    check_base_class_offset(lv, (A1*)(C19*)(E19x6*), ABISELECT(40,24), "G19x6y7");
    check_base_class_offset(lv, (B0*)(C19*)(E19x6*), ABISELECT(24,12), "G19x6y7");
    check_base_class_offset(lv, (C19*)(E19x6*), ABISELECT(16,8), "G19x6y7");
    check_base_class_offset(lv, (D0*)(E19x6*), ABISELECT(52,32), "G19x6y7");
    check_base_class_offset(lv, (E19x6*), ABISELECT(16,8), "G19x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G19x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x6y7.ff");
    test_class_info(&lv, &cd_G19x6y7);
    dp->~G19x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x6y7(Test_G19x6y7, "G19x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G19x6y7C1Ev();
extern void _ZN7G19x6y7D1Ev();
Name_Map name_map_G19x6y7[] = {
  NSPAIR(_ZN7G19x6y7C1Ev),
  NSPAIR(_ZN7G19x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x6;
extern VTBL_ENTRY _ZTI5E19x6[];
extern  VTBL_ENTRY _ZTV5E19x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x6y7[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x6y7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G19x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x6y7[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV5E19x6__7G19x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C195E19x6__7G19x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C195E19x6__7G19x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x6__7G19x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x6y7[] = {
  {&(_ZTV7G19x6y7[6]),  6,16},
  {&(_ZTV7G19x6y7[11]),  11,16},
  {&(_ZTV7G19x6y7[15]),  15,16},
  {&(_tg__ZTV5E19x6__7G19x6y7[4]),  4,5},
  {&(_tg__ZTV3C195E19x6__7G19x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C195E19x6__7G19x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E19x6__7G19x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x6y7[];
extern  VTBL_ENTRY _ZTV7G19x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x6y7[];
static VTBL_ENTRY alt_thunk_names142[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C193fooEv,_ZThn16_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x6y7 = {  "G19x6y7", // class name
  bases_G19x6y7, 6,
  &(vtc_G19x6y7[0]), // expected_vtbl_contents
  &(vtt_G19x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G19x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x6y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names142,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x6  : C20 , virtual D0 {
  int fd;
  ~E20x6(); // tgen
  E20x6(); // tgen
};
//SIG(-1 E20x6) C1{ BC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E20x6 ::~E20x6(){ note_dtor("E20x6", this);} // tgen
E20x6 ::E20x6(){ note_ctor("E20x6", this);} // tgen

static void Test_E20x6()
{
  extern Class_Descriptor cd_E20x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E20x6, buf);
    E20x6 *dp, &lv = *(dp=new (buf) E20x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E20x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x6)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(12,8), "E20x6");
    check_base_class_offset(lv, (B1*)(C20*), 0, "E20x6");
    check_base_class_offset(lv, (C20*), 0, "E20x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E20x6");
    check_field_offset(lv, fd, ABISELECT(20,16), "E20x6.fd");
    test_class_info(&lv, &cd_E20x6);
    dp->~E20x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x6(Test_E20x6, "E20x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E20x6C1Ev();
extern void _ZN5E20x6D1Ev();
Name_Map name_map_E20x6[] = {
  NSPAIR(_ZN5E20x6C1Ev),
  NSPAIR(_ZN5E20x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E20x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E20x6[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_E20x6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV5E20x6[];
static  VTT_ENTRY vtt_E20x6[] = {
  {&(_ZTV5E20x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
Class_Descriptor cd_E20x6 = {  "E20x6", // class name
  bases_E20x6, 4,
  &(vtc_E20x6[0]), // expected_vtbl_contents
  &(vtt_E20x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E20x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E20x6),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E20x6),1, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y0  : E20x6 , F1 {
  int ff;
  ~G20x6y0(); // tgen
  G20x6y0(); // tgen
};
//SIG(1 G20x6y0) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x6y0 ::~G20x6y0(){ note_dtor("G20x6y0", this);} // tgen
G20x6y0 ::G20x6y0(){ note_ctor("G20x6y0", this);} // tgen

static void Test_G20x6y0()
{
  extern Class_Descriptor cd_G20x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x6y0, buf);
    G20x6y0 *dp, &lv = *(dp=new (buf) G20x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y0)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(12,8), "G20x6y0");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), 0, "G20x6y0");
    check_base_class_offset(lv, (C20*)(E20x6*), 0, "G20x6y0");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(40,32), "G20x6y0");
    check_base_class_offset(lv, (E20x6*), 0, "G20x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,20), "G20x6y0");
    check_field_offset(lv, ff, ABISELECT(36,28), "G20x6y0.ff");
    test_class_info(&lv, &cd_G20x6y0);
    dp->~G20x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y0(Test_G20x6y0, "G20x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x6y0C1Ev();
extern void _ZN7G20x6y0D1Ev();
Name_Map name_map_G20x6y0[] = {
  NSPAIR(_ZN7G20x6y0C1Ev),
  NSPAIR(_ZN7G20x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,20), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y0[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y0[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G20x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y0[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y0[] = {
  ABISELECT(40,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y0[] = {
  {&(_ZTV7G20x6y0[3]),  3,7},
  {&(_tg__ZTV5E20x6__7G20x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y0[];
extern  VTBL_ENTRY _ZTV7G20x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y0[];
Class_Descriptor cd_G20x6y0 = {  "G20x6y0", // class name
  bases_G20x6y0, 6,
  &(vtc_G20x6y0[0]), // expected_vtbl_contents
  &(vtt_G20x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y0),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y0),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y1  : virtual E20x6 , F1 {
  int ff;
  ~G20x6y1(); // tgen
  G20x6y1(); // tgen
};
//SIG(1 G20x6y1) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x6y1 ::~G20x6y1(){ note_dtor("G20x6y1", this);} // tgen
G20x6y1 ::G20x6y1(){ note_ctor("G20x6y1", this);} // tgen

static void Test_G20x6y1()
{
  extern Class_Descriptor cd_G20x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x6y1, buf);
    G20x6y1 *dp, &lv = *(dp=new (buf) G20x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y1)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(28,20), "G20x6y1");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), ABISELECT(16,12), "G20x6y1");
    check_base_class_offset(lv, (C20*)(E20x6*), ABISELECT(16,12), "G20x6y1");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(40,32), "G20x6y1");
    check_base_class_offset(lv, (E20x6*), ABISELECT(16,12), "G20x6y1");
    check_base_class_offset(lv, (F1*), 0, "G20x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x6y1.ff");
    test_class_info(&lv, &cd_G20x6y1);
    dp->~G20x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y1(Test_G20x6y1, "G20x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x6y1C1Ev();
extern void _ZN7G20x6y1D1Ev();
Name_Map name_map_G20x6y1[] = {
  NSPAIR(_ZN7G20x6y1C1Ev),
  NSPAIR(_ZN7G20x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x6y1[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y1[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y1[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y1[] = {
  {&(_ZTV7G20x6y1[4]),  4,10},
  {&(_ZTV7G20x6y1[9]),  9,10},
  {&(_tg__ZTV5E20x6__7G20x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y1[];
extern  VTBL_ENTRY _ZTV7G20x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y1[];
Class_Descriptor cd_G20x6y1 = {  "G20x6y1", // class name
  bases_G20x6y1, 6,
  &(vtc_G20x6y1[0]), // expected_vtbl_contents
  &(vtt_G20x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y1),10, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y1),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y2  : E20x6 , virtual F1 {
  int ff;
  ~G20x6y2(); // tgen
  G20x6y2(); // tgen
};
//SIG(1 G20x6y2) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x6y2 ::~G20x6y2(){ note_dtor("G20x6y2", this);} // tgen
G20x6y2 ::G20x6y2(){ note_ctor("G20x6y2", this);} // tgen

static void Test_G20x6y2()
{
  extern Class_Descriptor cd_G20x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x6y2, buf);
    G20x6y2 *dp, &lv = *(dp=new (buf) G20x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y2)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(12,8), "G20x6y2");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), 0, "G20x6y2");
    check_base_class_offset(lv, (C20*)(E20x6*), 0, "G20x6y2");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(28,24), "G20x6y2");
    check_base_class_offset(lv, (E20x6*), 0, "G20x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G20x6y2");
    check_field_offset(lv, ff, ABISELECT(24,20), "G20x6y2.ff");
    test_class_info(&lv, &cd_G20x6y2);
    dp->~G20x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y2(Test_G20x6y2, "G20x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x6y2C1Ev();
extern void _ZN7G20x6y2D1Ev();
Name_Map name_map_G20x6y2[] = {
  NSPAIR(_ZN7G20x6y2C1Ev),
  NSPAIR(_ZN7G20x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y2[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y2[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G20x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y2[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y2[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y2[] = {
  {&(_ZTV7G20x6y2[4]),  4,9},
  {&(_tg__ZTV5E20x6__7G20x6y2[3]),  3,4},
  {&(_ZTV7G20x6y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G20x6y2[];
extern  VTBL_ENTRY _ZTV7G20x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y2[];
Class_Descriptor cd_G20x6y2 = {  "G20x6y2", // class name
  bases_G20x6y2, 6,
  &(vtc_G20x6y2[0]), // expected_vtbl_contents
  &(vtt_G20x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y2),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y2),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y3  : virtual E20x6 , virtual F1 {
  int ff;
  ~G20x6y3(); // tgen
  G20x6y3(); // tgen
};
//SIG(1 G20x6y3) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x6y3 ::~G20x6y3(){ note_dtor("G20x6y3", this);} // tgen
G20x6y3 ::G20x6y3(){ note_ctor("G20x6y3", this);} // tgen

static void Test_G20x6y3()
{
  extern Class_Descriptor cd_G20x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x6y3, buf);
    G20x6y3 *dp, &lv = *(dp=new (buf) G20x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y3)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(28,16), "G20x6y3");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), ABISELECT(16,8), "G20x6y3");
    check_base_class_offset(lv, (C20*)(E20x6*), ABISELECT(16,8), "G20x6y3");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(40,28), "G20x6y3");
    check_base_class_offset(lv, (E20x6*), ABISELECT(16,8), "G20x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G20x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x6y3.ff");
    test_class_info(&lv, &cd_G20x6y3);
    dp->~G20x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y3(Test_G20x6y3, "G20x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G20x6y3C1Ev();
extern void _ZN7G20x6y3D1Ev();
Name_Map name_map_G20x6y3[] = {
  NSPAIR(_ZN7G20x6y3C1Ev),
  NSPAIR(_ZN7G20x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y3[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x6y3[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G20x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y3[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y3[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y3[] = {
  {&(_ZTV7G20x6y3[5]),  5,14},
  {&(_ZTV7G20x6y3[9]),  9,14},
  {&(_ZTV7G20x6y3[13]),  13,14},
  {&(_tg__ZTV5E20x6__7G20x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y3[];
extern  VTBL_ENTRY _ZTV7G20x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y3[];
Class_Descriptor cd_G20x6y3 = {  "G20x6y3", // class name
  bases_G20x6y3, 6,
  &(vtc_G20x6y3[0]), // expected_vtbl_contents
  &(vtt_G20x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G20x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y3),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y3),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y4  : E20x6 , F0 {
  int ff;
  ~G20x6y4(); // tgen
  G20x6y4(); // tgen
};
//SIG(1 G20x6y4) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G20x6y4 ::~G20x6y4(){ note_dtor("G20x6y4", this);} // tgen
G20x6y4 ::G20x6y4(){ note_ctor("G20x6y4", this);} // tgen

static void Test_G20x6y4()
{
  extern Class_Descriptor cd_G20x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x6y4, buf);
    G20x6y4 *dp, &lv = *(dp=new (buf) G20x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y4)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(12,8), "G20x6y4");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), 0, "G20x6y4");
    check_base_class_offset(lv, (C20*)(E20x6*), 0, "G20x6y4");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(32,28), "G20x6y4");
    check_base_class_offset(lv, (E20x6*), 0, "G20x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(24,20), "G20x6y4");
    check_field_offset(lv, ff, ABISELECT(28,24), "G20x6y4.ff");
    test_class_info(&lv, &cd_G20x6y4);
    dp->~G20x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y4(Test_G20x6y4, "G20x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G20x6y4C1Ev();
extern void _ZN7G20x6y4D1Ev();
Name_Map name_map_G20x6y4[] = {
  NSPAIR(_ZN7G20x6y4C1Ev),
  NSPAIR(_ZN7G20x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y4[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y4[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y4[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y4[] = {
  ABISELECT(32,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y4[] = {
  {&(_ZTV7G20x6y4[3]),  3,4},
  {&(_tg__ZTV5E20x6__7G20x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y4[];
extern  VTBL_ENTRY _ZTV7G20x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y4[];
Class_Descriptor cd_G20x6y4 = {  "G20x6y4", // class name
  bases_G20x6y4, 6,
  &(vtc_G20x6y4[0]), // expected_vtbl_contents
  &(vtt_G20x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G20x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y4),4, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y4),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y5  : virtual E20x6 , F0 {
  int ff;
  ~G20x6y5(); // tgen
  G20x6y5(); // tgen
};
//SIG(1 G20x6y5) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G20x6y5 ::~G20x6y5(){ note_dtor("G20x6y5", this);} // tgen
G20x6y5 ::G20x6y5(){ note_ctor("G20x6y5", this);} // tgen

static void Test_G20x6y5()
{
  extern Class_Descriptor cd_G20x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x6y5, buf);
    G20x6y5 *dp, &lv = *(dp=new (buf) G20x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y5)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(28,20), "G20x6y5");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), ABISELECT(16,12), "G20x6y5");
    check_base_class_offset(lv, (C20*)(E20x6*), ABISELECT(16,12), "G20x6y5");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(40,32), "G20x6y5");
    check_base_class_offset(lv, (E20x6*), ABISELECT(16,12), "G20x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x6y5.ff");
    test_class_info(&lv, &cd_G20x6y5);
    dp->~G20x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y5(Test_G20x6y5, "G20x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x6y5C1Ev();
extern void _ZN7G20x6y5D1Ev();
Name_Map name_map_G20x6y5[] = {
  NSPAIR(_ZN7G20x6y5C1Ev),
  NSPAIR(_ZN7G20x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y5[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x6y5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y5[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y5[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y5[] = {
  {&(_ZTV7G20x6y5[4]),  4,9},
  {&(_ZTV7G20x6y5[8]),  8,9},
  {&(_tg__ZTV5E20x6__7G20x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y5[];
extern  VTBL_ENTRY _ZTV7G20x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y5[];
Class_Descriptor cd_G20x6y5 = {  "G20x6y5", // class name
  bases_G20x6y5, 6,
  &(vtc_G20x6y5[0]), // expected_vtbl_contents
  &(vtt_G20x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y5),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y5),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y6  : E20x6 , virtual F0 {
  int ff;
  ~G20x6y6(); // tgen
  G20x6y6(); // tgen
};
//SIG(1 G20x6y6) C1{ BC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x6y6 ::~G20x6y6(){ note_dtor("G20x6y6", this);} // tgen
G20x6y6 ::G20x6y6(){ note_ctor("G20x6y6", this);} // tgen

static void Test_G20x6y6()
{
  extern Class_Descriptor cd_G20x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G20x6y6, buf);
    G20x6y6 *dp, &lv = *(dp=new (buf) G20x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G20x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y6)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(12,8), "G20x6y6");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), 0, "G20x6y6");
    check_base_class_offset(lv, (C20*)(E20x6*), 0, "G20x6y6");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(28,24), "G20x6y6");
    check_base_class_offset(lv, (E20x6*), 0, "G20x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G20x6y6");
    check_field_offset(lv, ff, ABISELECT(24,20), "G20x6y6.ff");
    test_class_info(&lv, &cd_G20x6y6);
    dp->~G20x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y6(Test_G20x6y6, "G20x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G20x6y6C1Ev();
extern void _ZN7G20x6y6D1Ev();
Name_Map name_map_G20x6y6[] = {
  NSPAIR(_ZN7G20x6y6C1Ev),
  NSPAIR(_ZN7G20x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y6[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y6[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y6[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y6[] = {
  {&(_ZTV7G20x6y6[4]),  4,5},
  {&(_tg__ZTV5E20x6__7G20x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y6[];
extern  VTBL_ENTRY _ZTV7G20x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y6[];
Class_Descriptor cd_G20x6y6 = {  "G20x6y6", // class name
  bases_G20x6y6, 6,
  &(vtc_G20x6y6[0]), // expected_vtbl_contents
  &(vtt_G20x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G20x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y6),2, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x6y7  : virtual E20x6 , virtual F0 {
  int ff;
  ~G20x6y7(); // tgen
  G20x6y7(); // tgen
};
//SIG(1 G20x6y7) C1{ VBC2{ BC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x6y7 ::~G20x6y7(){ note_dtor("G20x6y7", this);} // tgen
G20x6y7 ::G20x6y7(){ note_ctor("G20x6y7", this);} // tgen

static void Test_G20x6y7()
{
  extern Class_Descriptor cd_G20x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x6y7, buf);
    G20x6y7 *dp, &lv = *(dp=new (buf) G20x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x6y7)");
    check_base_class_offset(lv, (A0*)(C20*)(E20x6*), ABISELECT(28,16), "G20x6y7");
    check_base_class_offset(lv, (B1*)(C20*)(E20x6*), ABISELECT(16,8), "G20x6y7");
    check_base_class_offset(lv, (C20*)(E20x6*), ABISELECT(16,8), "G20x6y7");
    check_base_class_offset(lv, (D0*)(E20x6*), ABISELECT(40,28), "G20x6y7");
    check_base_class_offset(lv, (E20x6*), ABISELECT(16,8), "G20x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G20x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x6y7.ff");
    test_class_info(&lv, &cd_G20x6y7);
    dp->~G20x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x6y7(Test_G20x6y7, "G20x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x6y7C1Ev();
extern void _ZN7G20x6y7D1Ev();
Name_Map name_map_G20x6y7[] = {
  NSPAIR(_ZN7G20x6y7C1Ev),
  NSPAIR(_ZN7G20x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x6;
extern VTBL_ENTRY _ZTI5E20x6[];
extern  VTBL_ENTRY _ZTV5E20x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x6y7[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x6y7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x6y7[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV5E20x6__7G20x6y7[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x6y7[] = {
  {&(_ZTV7G20x6y7[5]),  5,10},
  {&(_ZTV7G20x6y7[9]),  9,10},
  {&(_tg__ZTV5E20x6__7G20x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x6y7[];
extern  VTBL_ENTRY _ZTV7G20x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x6y7[];
Class_Descriptor cd_G20x6y7 = {  "G20x6y7", // class name
  bases_G20x6y7, 6,
  &(vtc_G20x6y7[0]), // expected_vtbl_contents
  &(vtt_G20x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x6y7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x6y7),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E21x6  : C21 , virtual D0 {
  int fd;
  ~E21x6(); // tgen
  E21x6(); // tgen
};
//SIG(-1 E21x6) C1{ BC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E21x6 ::~E21x6(){ note_dtor("E21x6", this);} // tgen
E21x6 ::E21x6(){ note_ctor("E21x6", this);} // tgen

static void Test_E21x6()
{
  extern Class_Descriptor cd_E21x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E21x6, buf);
    E21x6 *dp, &lv = *(dp=new (buf) E21x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E21x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x6)");
    check_base_class_offset(lv, (A1*)(C21*), 0, "E21x6");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(16,8), "E21x6");
    check_base_class_offset(lv, (C21*), 0, "E21x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E21x6");
    check_field_offset(lv, fd, ABISELECT(32,20), "E21x6.fd");
    test_class_info(&lv, &cd_E21x6);
    dp->~E21x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x6(Test_E21x6, "E21x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E21x6C1Ev();
extern void _ZN5E21x6D1Ev();
Name_Map name_map_E21x6[] = {
  NSPAIR(_ZN5E21x6C1Ev),
  NSPAIR(_ZN5E21x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E21x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E21x6[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_E21x6[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV5E21x6[];
static  VTT_ENTRY vtt_E21x6[] = {
  {&(_ZTV5E21x6[3]),  3,7},
};
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
Class_Descriptor cd_E21x6 = {  "E21x6", // class name
  bases_E21x6, 4,
  &(vtc_E21x6[0]), // expected_vtbl_contents
  &(vtt_E21x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E21x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E21x6),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E21x6),1, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y0  : E21x6 , F1 {
  int ff;
  ~G21x6y0(); // tgen
  G21x6y0(); // tgen
};
//SIG(1 G21x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x6y0 ::~G21x6y0(){ note_dtor("G21x6y0", this);} // tgen
G21x6y0 ::G21x6y0(){ note_ctor("G21x6y0", this);} // tgen

static void Test_G21x6y0()
{
  extern Class_Descriptor cd_G21x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x6y0, buf);
    G21x6y0 *dp, &lv = *(dp=new (buf) G21x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y0)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), 0, "G21x6y0");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(16,8), "G21x6y0");
    check_base_class_offset(lv, (C21*)(E21x6*), 0, "G21x6y0");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(56,36), "G21x6y0");
    check_base_class_offset(lv, (E21x6*), 0, "G21x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(40,24), "G21x6y0");
    check_field_offset(lv, ff, ABISELECT(52,32), "G21x6y0.ff");
    test_class_info(&lv, &cd_G21x6y0);
    dp->~G21x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y0(Test_G21x6y0, "G21x6y0", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x6y0C1Ev();
extern void _ZN7G21x6y0D1Ev();
Name_Map name_map_G21x6y0[] = {
  NSPAIR(_ZN7G21x6y0C1Ev),
  NSPAIR(_ZN7G21x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,24), //bcp->offset
    7, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y0[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x6y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y0[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G21x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x6y0[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y0[] = {
  ABISELECT(56,36),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y0[] = {
  {&(_ZTV7G21x6y0[3]),  3,10},
  {&(_tg__ZTV5E21x6__7G21x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y0[];
extern  VTBL_ENTRY _ZTV7G21x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y0[];
Class_Descriptor cd_G21x6y0 = {  "G21x6y0", // class name
  bases_G21x6y0, 6,
  &(vtc_G21x6y0[0]), // expected_vtbl_contents
  &(vtt_G21x6y0[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y0),10, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y0),2, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y1  : virtual E21x6 , F1 {
  int ff;
  ~G21x6y1(); // tgen
  G21x6y1(); // tgen
};
//SIG(1 G21x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x6y1 ::~G21x6y1(){ note_dtor("G21x6y1", this);} // tgen
G21x6y1 ::G21x6y1(){ note_ctor("G21x6y1", this);} // tgen

static void Test_G21x6y1()
{
  extern Class_Descriptor cd_G21x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x6y1, buf);
    G21x6y1 *dp, &lv = *(dp=new (buf) G21x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y1)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), ABISELECT(16,12), "G21x6y1");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(32,20), "G21x6y1");
    check_base_class_offset(lv, (C21*)(E21x6*), ABISELECT(16,12), "G21x6y1");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(52,36), "G21x6y1");
    check_base_class_offset(lv, (E21x6*), ABISELECT(16,12), "G21x6y1");
    check_base_class_offset(lv, (F1*), 0, "G21x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x6y1.ff");
    test_class_info(&lv, &cd_G21x6y1);
    dp->~G21x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y1(Test_G21x6y1, "G21x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x6y1C1Ev();
extern void _ZN7G21x6y1D1Ev();
Name_Map name_map_G21x6y1[] = {
  NSPAIR(_ZN7G21x6y1C1Ev),
  NSPAIR(_ZN7G21x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x6y1[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x6y1[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y1[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y1[] = {
  {&(_ZTV7G21x6y1[4]),  4,13},
  {&(_ZTV7G21x6y1[9]),  9,13},
  {&(_ZTV7G21x6y1[12]),  12,13},
  {&(_tg__ZTV5E21x6__7G21x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y1[];
extern  VTBL_ENTRY _ZTV7G21x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y1[];
Class_Descriptor cd_G21x6y1 = {  "G21x6y1", // class name
  bases_G21x6y1, 6,
  &(vtc_G21x6y1[0]), // expected_vtbl_contents
  &(vtt_G21x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y1),13, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y1),4, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y2  : E21x6 , virtual F1 {
  int ff;
  ~G21x6y2(); // tgen
  G21x6y2(); // tgen
};
//SIG(1 G21x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x6y2 ::~G21x6y2(){ note_dtor("G21x6y2", this);} // tgen
G21x6y2 ::G21x6y2(){ note_ctor("G21x6y2", this);} // tgen

static void Test_G21x6y2()
{
  extern Class_Descriptor cd_G21x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x6y2, buf);
    G21x6y2 *dp, &lv = *(dp=new (buf) G21x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y2)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), 0, "G21x6y2");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(16,8), "G21x6y2");
    check_base_class_offset(lv, (C21*)(E21x6*), 0, "G21x6y2");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(40,28), "G21x6y2");
    check_base_class_offset(lv, (E21x6*), 0, "G21x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G21x6y2");
    check_field_offset(lv, ff, ABISELECT(36,24), "G21x6y2.ff");
    test_class_info(&lv, &cd_G21x6y2);
    dp->~G21x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y2(Test_G21x6y2, "G21x6y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x6y2C1Ev();
extern void _ZN7G21x6y2D1Ev();
Name_Map name_map_G21x6y2[] = {
  NSPAIR(_ZN7G21x6y2C1Ev),
  NSPAIR(_ZN7G21x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y2[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x6y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y2[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G21x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x6y2[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y2[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y2[] = {
  {&(_ZTV7G21x6y2[4]),  4,12},
  {&(_tg__ZTV5E21x6__7G21x6y2[3]),  3,4},
  {&(_ZTV7G21x6y2[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G21x6y2[];
extern  VTBL_ENTRY _ZTV7G21x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y2[];
Class_Descriptor cd_G21x6y2 = {  "G21x6y2", // class name
  bases_G21x6y2, 6,
  &(vtc_G21x6y2[0]), // expected_vtbl_contents
  &(vtt_G21x6y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y2),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y2),3, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y3  : virtual E21x6 , virtual F1 {
  int ff;
  ~G21x6y3(); // tgen
  G21x6y3(); // tgen
};
//SIG(1 G21x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x6y3 ::~G21x6y3(){ note_dtor("G21x6y3", this);} // tgen
G21x6y3 ::G21x6y3(){ note_ctor("G21x6y3", this);} // tgen

static void Test_G21x6y3()
{
  extern Class_Descriptor cd_G21x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x6y3, buf);
    G21x6y3 *dp, &lv = *(dp=new (buf) G21x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y3)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), ABISELECT(16,8), "G21x6y3");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(32,16), "G21x6y3");
    check_base_class_offset(lv, (C21*)(E21x6*), ABISELECT(16,8), "G21x6y3");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(52,32), "G21x6y3");
    check_base_class_offset(lv, (E21x6*), ABISELECT(16,8), "G21x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x6y3.ff");
    test_class_info(&lv, &cd_G21x6y3);
    dp->~G21x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y3(Test_G21x6y3, "G21x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x6y3C1Ev();
extern void _ZN7G21x6y3D1Ev();
Name_Map name_map_G21x6y3[] = {
  NSPAIR(_ZN7G21x6y3C1Ev),
  NSPAIR(_ZN7G21x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y3[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x6y3[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G21x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G21x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x6y3[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y3[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y3[] = {
  {&(_ZTV7G21x6y3[5]),  5,17},
  {&(_ZTV7G21x6y3[9]),  9,17},
  {&(_ZTV7G21x6y3[12]),  12,17},
  {&(_ZTV7G21x6y3[16]),  16,17},
  {&(_tg__ZTV5E21x6__7G21x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y3[];
extern  VTBL_ENTRY _ZTV7G21x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y3[];
Class_Descriptor cd_G21x6y3 = {  "G21x6y3", // class name
  bases_G21x6y3, 6,
  &(vtc_G21x6y3[0]), // expected_vtbl_contents
  &(vtt_G21x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y3),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y3),5, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y4  : E21x6 , F0 {
  int ff;
  ~G21x6y4(); // tgen
  G21x6y4(); // tgen
};
//SIG(1 G21x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G21x6y4 ::~G21x6y4(){ note_dtor("G21x6y4", this);} // tgen
G21x6y4 ::G21x6y4(){ note_ctor("G21x6y4", this);} // tgen

static void Test_G21x6y4()
{
  extern Class_Descriptor cd_G21x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x6y4, buf);
    G21x6y4 *dp, &lv = *(dp=new (buf) G21x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y4)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), 0, "G21x6y4");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(16,8), "G21x6y4");
    check_base_class_offset(lv, (C21*)(E21x6*), 0, "G21x6y4");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(44,32), "G21x6y4");
    check_base_class_offset(lv, (E21x6*), 0, "G21x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(36,24), "G21x6y4");
    check_field_offset(lv, ff, ABISELECT(40,28), "G21x6y4.ff");
    test_class_info(&lv, &cd_G21x6y4);
    dp->~G21x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y4(Test_G21x6y4, "G21x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G21x6y4C1Ev();
extern void _ZN7G21x6y4D1Ev();
Name_Map name_map_G21x6y4[] = {
  NSPAIR(_ZN7G21x6y4C1Ev),
  NSPAIR(_ZN7G21x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y4[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x6y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y4[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x6y4[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y4[] = {
  ABISELECT(44,32),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y4[] = {
  {&(_ZTV7G21x6y4[3]),  3,7},
  {&(_tg__ZTV5E21x6__7G21x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y4[];
extern  VTBL_ENTRY _ZTV7G21x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y4[];
Class_Descriptor cd_G21x6y4 = {  "G21x6y4", // class name
  bases_G21x6y4, 6,
  &(vtc_G21x6y4[0]), // expected_vtbl_contents
  &(vtt_G21x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G21x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y4),7, //virtual function table var
  3, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y4),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y5  : virtual E21x6 , F0 {
  int ff;
  ~G21x6y5(); // tgen
  G21x6y5(); // tgen
};
//SIG(1 G21x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G21x6y5 ::~G21x6y5(){ note_dtor("G21x6y5", this);} // tgen
G21x6y5 ::G21x6y5(){ note_ctor("G21x6y5", this);} // tgen

static void Test_G21x6y5()
{
  extern Class_Descriptor cd_G21x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x6y5, buf);
    G21x6y5 *dp, &lv = *(dp=new (buf) G21x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y5)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), ABISELECT(16,12), "G21x6y5");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(32,20), "G21x6y5");
    check_base_class_offset(lv, (C21*)(E21x6*), ABISELECT(16,12), "G21x6y5");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(52,36), "G21x6y5");
    check_base_class_offset(lv, (E21x6*), ABISELECT(16,12), "G21x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x6y5.ff");
    test_class_info(&lv, &cd_G21x6y5);
    dp->~G21x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y5(Test_G21x6y5, "G21x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x6y5C1Ev();
extern void _ZN7G21x6y5D1Ev();
Name_Map name_map_G21x6y5[] = {
  NSPAIR(_ZN7G21x6y5C1Ev),
  NSPAIR(_ZN7G21x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    ABISELECT(16,12), //bcp->offset
    4, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y5[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x6y5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x6y5[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y5[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y5[] = {
  {&(_ZTV7G21x6y5[4]),  4,12},
  {&(_ZTV7G21x6y5[8]),  8,12},
  {&(_ZTV7G21x6y5[11]),  11,12},
  {&(_tg__ZTV5E21x6__7G21x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y5[];
extern  VTBL_ENTRY _ZTV7G21x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y5[];
Class_Descriptor cd_G21x6y5 = {  "G21x6y5", // class name
  bases_G21x6y5, 6,
  &(vtc_G21x6y5[0]), // expected_vtbl_contents
  &(vtt_G21x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y5),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y5),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y6  : E21x6 , virtual F0 {
  int ff;
  ~G21x6y6(); // tgen
  G21x6y6(); // tgen
};
//SIG(1 G21x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x6y6 ::~G21x6y6(){ note_dtor("G21x6y6", this);} // tgen
G21x6y6 ::G21x6y6(){ note_ctor("G21x6y6", this);} // tgen

static void Test_G21x6y6()
{
  extern Class_Descriptor cd_G21x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G21x6y6, buf);
    G21x6y6 *dp, &lv = *(dp=new (buf) G21x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G21x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y6)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), 0, "G21x6y6");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(16,8), "G21x6y6");
    check_base_class_offset(lv, (C21*)(E21x6*), 0, "G21x6y6");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(40,28), "G21x6y6");
    check_base_class_offset(lv, (E21x6*), 0, "G21x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G21x6y6");
    check_field_offset(lv, ff, ABISELECT(36,24), "G21x6y6.ff");
    test_class_info(&lv, &cd_G21x6y6);
    dp->~G21x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y6(Test_G21x6y6, "G21x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G21x6y6C1Ev();
extern void _ZN7G21x6y6D1Ev();
Name_Map name_map_G21x6y6[] = {
  NSPAIR(_ZN7G21x6y6C1Ev),
  NSPAIR(_ZN7G21x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y6[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x6y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x6y6[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y6[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y6[] = {
  {&(_ZTV7G21x6y6[4]),  4,8},
  {&(_tg__ZTV5E21x6__7G21x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y6[];
extern  VTBL_ENTRY _ZTV7G21x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y6[];
Class_Descriptor cd_G21x6y6 = {  "G21x6y6", // class name
  bases_G21x6y6, 6,
  &(vtc_G21x6y6[0]), // expected_vtbl_contents
  &(vtt_G21x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G21x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y6),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y6),2, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x6y7  : virtual E21x6 , virtual F0 {
  int ff;
  ~G21x6y7(); // tgen
  G21x6y7(); // tgen
};
//SIG(1 G21x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x6y7 ::~G21x6y7(){ note_dtor("G21x6y7", this);} // tgen
G21x6y7 ::G21x6y7(){ note_ctor("G21x6y7", this);} // tgen

static void Test_G21x6y7()
{
  extern Class_Descriptor cd_G21x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x6y7, buf);
    G21x6y7 *dp, &lv = *(dp=new (buf) G21x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x6y7)");
    check_base_class_offset(lv, (A1*)(C21*)(E21x6*), ABISELECT(16,8), "G21x6y7");
    check_base_class_offset(lv, (B1*)(C21*)(E21x6*), ABISELECT(32,16), "G21x6y7");
    check_base_class_offset(lv, (C21*)(E21x6*), ABISELECT(16,8), "G21x6y7");
    check_base_class_offset(lv, (D0*)(E21x6*), ABISELECT(52,32), "G21x6y7");
    check_base_class_offset(lv, (E21x6*), ABISELECT(16,8), "G21x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G21x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x6y7.ff");
    test_class_info(&lv, &cd_G21x6y7);
    dp->~G21x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x6y7(Test_G21x6y7, "G21x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x6y7C1Ev();
extern void _ZN7G21x6y7D1Ev();
Name_Map name_map_G21x6y7[] = {
  NSPAIR(_ZN7G21x6y7C1Ev),
  NSPAIR(_ZN7G21x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x6;
extern VTBL_ENTRY _ZTI5E21x6[];
extern  VTBL_ENTRY _ZTV5E21x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x6y7[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x6y7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G21x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x6y7[];
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV5E21x6__7G21x6y7[] = {
  ABISELECT(36,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
static  VTT_ENTRY vtt_G21x6y7[] = {
  {&(_ZTV7G21x6y7[5]),  5,13},
  {&(_ZTV7G21x6y7[9]),  9,13},
  {&(_ZTV7G21x6y7[12]),  12,13},
  {&(_tg__ZTV5E21x6__7G21x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G21x6y7[];
extern  VTBL_ENTRY _ZTV7G21x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x6y7[];
Class_Descriptor cd_G21x6y7 = {  "G21x6y7", // class name
  bases_G21x6y7, 6,
  &(vtc_G21x6y7[0]), // expected_vtbl_contents
  &(vtt_G21x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x6y7),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x6y7),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E22x6  : C22 , virtual D0 {
  int fd;
  ~E22x6(); // tgen
  E22x6(); // tgen
};
//SIG(-1 E22x6) C1{ BC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E22x6 ::~E22x6(){ note_dtor("E22x6", this);} // tgen
E22x6 ::E22x6(){ note_ctor("E22x6", this);} // tgen

static void Test_E22x6()
{
  extern Class_Descriptor cd_E22x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E22x6, buf);
    E22x6 *dp, &lv = *(dp=new (buf) E22x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E22x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x6)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(20,16), "E22x6");
    check_base_class_offset(lv, (B1*)(C22*), 0, "E22x6");
    check_base_class_offset(lv, (C22*), 0, "E22x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E22x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E22x6.fd");
    test_class_info(&lv, &cd_E22x6);
    dp->~E22x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x6(Test_E22x6, "E22x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E22x6C1Ev();
extern void _ZN5E22x6D1Ev();
Name_Map name_map_E22x6[] = {
  NSPAIR(_ZN5E22x6C1Ev),
  NSPAIR(_ZN5E22x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E22x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E22x6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_E22x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV5E22x6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x6[] = {
  {&(_ZTV5E22x6[4]),  4,5},
  {&(_tg__ZTV3C22__5E22x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
Class_Descriptor cd_E22x6 = {  "E22x6", // class name
  bases_E22x6, 4,
  &(vtc_E22x6[0]), // expected_vtbl_contents
  &(vtt_E22x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E22x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E22x6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E22x6),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y0  : E22x6 , F1 {
  int ff;
  ~G22x6y0(); // tgen
  G22x6y0(); // tgen
};
//SIG(1 G22x6y0) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x6y0 ::~G22x6y0(){ note_dtor("G22x6y0", this);} // tgen
G22x6y0 ::G22x6y0(){ note_ctor("G22x6y0", this);} // tgen

static void Test_G22x6y0()
{
  extern Class_Descriptor cd_G22x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x6y0, buf);
    G22x6y0 *dp, &lv = *(dp=new (buf) G22x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y0)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(40,28), "G22x6y0");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), 0, "G22x6y0");
    check_base_class_offset(lv, (C22*)(E22x6*), 0, "G22x6y0");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(44,32), "G22x6y0");
    check_base_class_offset(lv, (E22x6*), 0, "G22x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G22x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G22x6y0.ff");
    test_class_info(&lv, &cd_G22x6y0);
    dp->~G22x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y0(Test_G22x6y0, "G22x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x6y0C1Ev();
extern void _ZN7G22x6y0D1Ev();
Name_Map name_map_G22x6y0[] = {
  NSPAIR(_ZN7G22x6y0C1Ev),
  NSPAIR(_ZN7G22x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y0[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y0[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G22x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y0[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y0[] = {
  {&(_ZTV7G22x6y0[4]),  4,8},
  {&(_tg__ZTV5E22x6__7G22x6y0[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y0[];
extern  VTBL_ENTRY _ZTV7G22x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y0[];
Class_Descriptor cd_G22x6y0 = {  "G22x6y0", // class name
  bases_G22x6y0, 6,
  &(vtc_G22x6y0[0]), // expected_vtbl_contents
  &(vtt_G22x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y1  : virtual E22x6 , F1 {
  int ff;
  ~G22x6y1(); // tgen
  G22x6y1(); // tgen
};
//SIG(1 G22x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x6y1 ::~G22x6y1(){ note_dtor("G22x6y1", this);} // tgen
G22x6y1 ::G22x6y1(){ note_ctor("G22x6y1", this);} // tgen

static void Test_G22x6y1()
{
  extern Class_Descriptor cd_G22x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x6y1, buf);
    G22x6y1 *dp, &lv = *(dp=new (buf) G22x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y1)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(36,28), "G22x6y1");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), ABISELECT(16,12), "G22x6y1");
    check_base_class_offset(lv, (C22*)(E22x6*), ABISELECT(16,12), "G22x6y1");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(40,32), "G22x6y1");
    check_base_class_offset(lv, (E22x6*), ABISELECT(16,12), "G22x6y1");
    check_base_class_offset(lv, (F1*), 0, "G22x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x6y1.ff");
    test_class_info(&lv, &cd_G22x6y1);
    dp->~G22x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y1(Test_G22x6y1, "G22x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x6y1C1Ev();
extern void _ZN7G22x6y1D1Ev();
Name_Map name_map_G22x6y1[] = {
  NSPAIR(_ZN7G22x6y1C1Ev),
  NSPAIR(_ZN7G22x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x6y1[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y1[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y1[] = {
  {&(_ZTV7G22x6y1[5]),  5,12},
  {&(_ZTV7G22x6y1[11]),  11,12},
  {&(_tg__ZTV5E22x6__7G22x6y1[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y1[];
extern  VTBL_ENTRY _ZTV7G22x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y1[];
Class_Descriptor cd_G22x6y1 = {  "G22x6y1", // class name
  bases_G22x6y1, 6,
  &(vtc_G22x6y1[0]), // expected_vtbl_contents
  &(vtt_G22x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y2  : E22x6 , virtual F1 {
  int ff;
  ~G22x6y2(); // tgen
  G22x6y2(); // tgen
};
//SIG(1 G22x6y2) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x6y2 ::~G22x6y2(){ note_dtor("G22x6y2", this);} // tgen
G22x6y2 ::G22x6y2(){ note_ctor("G22x6y2", this);} // tgen

static void Test_G22x6y2()
{
  extern Class_Descriptor cd_G22x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x6y2, buf);
    G22x6y2 *dp, &lv = *(dp=new (buf) G22x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y2)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(24,20), "G22x6y2");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), 0, "G22x6y2");
    check_base_class_offset(lv, (C22*)(E22x6*), 0, "G22x6y2");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(28,24), "G22x6y2");
    check_base_class_offset(lv, (E22x6*), 0, "G22x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G22x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G22x6y2.ff");
    test_class_info(&lv, &cd_G22x6y2);
    dp->~G22x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y2(Test_G22x6y2, "G22x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x6y2C1Ev();
extern void _ZN7G22x6y2D1Ev();
Name_Map name_map_G22x6y2[] = {
  NSPAIR(_ZN7G22x6y2C1Ev),
  NSPAIR(_ZN7G22x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y2[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y2[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G22x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y2[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y2[] = {
  {&(_ZTV7G22x6y2[5]),  5,10},
  {&(_tg__ZTV5E22x6__7G22x6y2[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y2[3]),  3,4},
  {&(_ZTV7G22x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G22x6y2[];
extern  VTBL_ENTRY _ZTV7G22x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y2[];
Class_Descriptor cd_G22x6y2 = {  "G22x6y2", // class name
  bases_G22x6y2, 6,
  &(vtc_G22x6y2[0]), // expected_vtbl_contents
  &(vtt_G22x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y3  : virtual E22x6 , virtual F1 {
  int ff;
  ~G22x6y3(); // tgen
  G22x6y3(); // tgen
};
//SIG(1 G22x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x6y3 ::~G22x6y3(){ note_dtor("G22x6y3", this);} // tgen
G22x6y3 ::G22x6y3(){ note_ctor("G22x6y3", this);} // tgen

static void Test_G22x6y3()
{
  extern Class_Descriptor cd_G22x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x6y3, buf);
    G22x6y3 *dp, &lv = *(dp=new (buf) G22x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y3)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(36,24), "G22x6y3");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), ABISELECT(16,8), "G22x6y3");
    check_base_class_offset(lv, (C22*)(E22x6*), ABISELECT(16,8), "G22x6y3");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(40,28), "G22x6y3");
    check_base_class_offset(lv, (E22x6*), ABISELECT(16,8), "G22x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G22x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x6y3.ff");
    test_class_info(&lv, &cd_G22x6y3);
    dp->~G22x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y3(Test_G22x6y3, "G22x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G22x6y3C1Ev();
extern void _ZN7G22x6y3D1Ev();
Name_Map name_map_G22x6y3[] = {
  NSPAIR(_ZN7G22x6y3C1Ev),
  NSPAIR(_ZN7G22x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y3[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x6y3[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G22x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y3[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y3[] = {
  {&(_ZTV7G22x6y3[6]),  6,16},
  {&(_ZTV7G22x6y3[11]),  11,16},
  {&(_ZTV7G22x6y3[15]),  15,16},
  {&(_tg__ZTV5E22x6__7G22x6y3[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y3[];
extern  VTBL_ENTRY _ZTV7G22x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y3[];
Class_Descriptor cd_G22x6y3 = {  "G22x6y3", // class name
  bases_G22x6y3, 6,
  &(vtc_G22x6y3[0]), // expected_vtbl_contents
  &(vtt_G22x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G22x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y4  : E22x6 , F0 {
  int ff;
  ~G22x6y4(); // tgen
  G22x6y4(); // tgen
};
//SIG(1 G22x6y4) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G22x6y4 ::~G22x6y4(){ note_dtor("G22x6y4", this);} // tgen
G22x6y4 ::G22x6y4(){ note_ctor("G22x6y4", this);} // tgen

static void Test_G22x6y4()
{
  extern Class_Descriptor cd_G22x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x6y4, buf);
    G22x6y4 *dp, &lv = *(dp=new (buf) G22x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y4)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(28,24), "G22x6y4");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), 0, "G22x6y4");
    check_base_class_offset(lv, (C22*)(E22x6*), 0, "G22x6y4");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(32,28), "G22x6y4");
    check_base_class_offset(lv, (E22x6*), 0, "G22x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G22x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G22x6y4.ff");
    test_class_info(&lv, &cd_G22x6y4);
    dp->~G22x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y4(Test_G22x6y4, "G22x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G22x6y4C1Ev();
extern void _ZN7G22x6y4D1Ev();
Name_Map name_map_G22x6y4[] = {
  NSPAIR(_ZN7G22x6y4C1Ev),
  NSPAIR(_ZN7G22x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y4[] = {
  {&(_ZTV7G22x6y4[4]),  4,5},
  {&(_tg__ZTV5E22x6__7G22x6y4[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y4[];
extern  VTBL_ENTRY _ZTV7G22x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y4[];
Class_Descriptor cd_G22x6y4 = {  "G22x6y4", // class name
  bases_G22x6y4, 6,
  &(vtc_G22x6y4[0]), // expected_vtbl_contents
  &(vtt_G22x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G22x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y5  : virtual E22x6 , F0 {
  int ff;
  ~G22x6y5(); // tgen
  G22x6y5(); // tgen
};
//SIG(1 G22x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G22x6y5 ::~G22x6y5(){ note_dtor("G22x6y5", this);} // tgen
G22x6y5 ::G22x6y5(){ note_ctor("G22x6y5", this);} // tgen

static void Test_G22x6y5()
{
  extern Class_Descriptor cd_G22x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x6y5, buf);
    G22x6y5 *dp, &lv = *(dp=new (buf) G22x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y5)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(36,28), "G22x6y5");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), ABISELECT(16,12), "G22x6y5");
    check_base_class_offset(lv, (C22*)(E22x6*), ABISELECT(16,12), "G22x6y5");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(40,32), "G22x6y5");
    check_base_class_offset(lv, (E22x6*), ABISELECT(16,12), "G22x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x6y5.ff");
    test_class_info(&lv, &cd_G22x6y5);
    dp->~G22x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y5(Test_G22x6y5, "G22x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x6y5C1Ev();
extern void _ZN7G22x6y5D1Ev();
Name_Map name_map_G22x6y5[] = {
  NSPAIR(_ZN7G22x6y5C1Ev),
  NSPAIR(_ZN7G22x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x6y5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y5[] = {
  {&(_ZTV7G22x6y5[5]),  5,11},
  {&(_ZTV7G22x6y5[10]),  10,11},
  {&(_tg__ZTV5E22x6__7G22x6y5[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y5[];
extern  VTBL_ENTRY _ZTV7G22x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y5[];
Class_Descriptor cd_G22x6y5 = {  "G22x6y5", // class name
  bases_G22x6y5, 6,
  &(vtc_G22x6y5[0]), // expected_vtbl_contents
  &(vtt_G22x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y6  : E22x6 , virtual F0 {
  int ff;
  ~G22x6y6(); // tgen
  G22x6y6(); // tgen
};
//SIG(1 G22x6y6) C1{ BC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x6y6 ::~G22x6y6(){ note_dtor("G22x6y6", this);} // tgen
G22x6y6 ::G22x6y6(){ note_ctor("G22x6y6", this);} // tgen

static void Test_G22x6y6()
{
  extern Class_Descriptor cd_G22x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G22x6y6, buf);
    G22x6y6 *dp, &lv = *(dp=new (buf) G22x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G22x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y6)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(24,20), "G22x6y6");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), 0, "G22x6y6");
    check_base_class_offset(lv, (C22*)(E22x6*), 0, "G22x6y6");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(28,24), "G22x6y6");
    check_base_class_offset(lv, (E22x6*), 0, "G22x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G22x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G22x6y6.ff");
    test_class_info(&lv, &cd_G22x6y6);
    dp->~G22x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y6(Test_G22x6y6, "G22x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G22x6y6C1Ev();
extern void _ZN7G22x6y6D1Ev();
Name_Map name_map_G22x6y6[] = {
  NSPAIR(_ZN7G22x6y6C1Ev),
  NSPAIR(_ZN7G22x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y6[] = {
  {&(_ZTV7G22x6y6[5]),  5,6},
  {&(_tg__ZTV5E22x6__7G22x6y6[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y6[];
extern  VTBL_ENTRY _ZTV7G22x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y6[];
Class_Descriptor cd_G22x6y6 = {  "G22x6y6", // class name
  bases_G22x6y6, 6,
  &(vtc_G22x6y6[0]), // expected_vtbl_contents
  &(vtt_G22x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G22x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x6y7  : virtual E22x6 , virtual F0 {
  int ff;
  ~G22x6y7(); // tgen
  G22x6y7(); // tgen
};
//SIG(1 G22x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x6y7 ::~G22x6y7(){ note_dtor("G22x6y7", this);} // tgen
G22x6y7 ::G22x6y7(){ note_ctor("G22x6y7", this);} // tgen

static void Test_G22x6y7()
{
  extern Class_Descriptor cd_G22x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x6y7, buf);
    G22x6y7 *dp, &lv = *(dp=new (buf) G22x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x6y7)");
    check_base_class_offset(lv, (A0*)(C22*)(E22x6*), ABISELECT(36,24), "G22x6y7");
    check_base_class_offset(lv, (B1*)(C22*)(E22x6*), ABISELECT(16,8), "G22x6y7");
    check_base_class_offset(lv, (C22*)(E22x6*), ABISELECT(16,8), "G22x6y7");
    check_base_class_offset(lv, (D0*)(E22x6*), ABISELECT(40,28), "G22x6y7");
    check_base_class_offset(lv, (E22x6*), ABISELECT(16,8), "G22x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G22x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x6y7.ff");
    test_class_info(&lv, &cd_G22x6y7);
    dp->~G22x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x6y7(Test_G22x6y7, "G22x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x6y7C1Ev();
extern void _ZN7G22x6y7D1Ev();
Name_Map name_map_G22x6y7[] = {
  NSPAIR(_ZN7G22x6y7C1Ev),
  NSPAIR(_ZN7G22x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x6;
extern VTBL_ENTRY _ZTI5E22x6[];
extern  VTBL_ENTRY _ZTV5E22x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x6y7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x6y7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x6y7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV5E22x6__7G22x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C225E22x6__7G22x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x6y7[] = {
  {&(_ZTV7G22x6y7[6]),  6,12},
  {&(_ZTV7G22x6y7[11]),  11,12},
  {&(_tg__ZTV5E22x6__7G22x6y7[4]),  4,5},
  {&(_tg__ZTV3C225E22x6__7G22x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x6y7[];
extern  VTBL_ENTRY _ZTV7G22x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x6y7[];
Class_Descriptor cd_G22x6y7 = {  "G22x6y7", // class name
  bases_G22x6y7, 6,
  &(vtc_G22x6y7[0]), // expected_vtbl_contents
  &(vtt_G22x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x6y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x6y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E23x6  : C23 , virtual D0 {
  int fd;
  ~E23x6(); // tgen
  E23x6(); // tgen
};
//SIG(-1 E23x6) C1{ BC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E23x6 ::~E23x6(){ note_dtor("E23x6", this);} // tgen
E23x6 ::E23x6(){ note_ctor("E23x6", this);} // tgen

static void Test_E23x6()
{
  extern Class_Descriptor cd_E23x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E23x6, buf);
    E23x6 *dp, &lv = *(dp=new (buf) E23x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E23x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x6)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(24,16), "E23x6");
    check_base_class_offset(lv, (B1*)(C23*), 0, "E23x6");
    check_base_class_offset(lv, (C23*), 0, "E23x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E23x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E23x6.fd");
    test_class_info(&lv, &cd_E23x6);
    dp->~E23x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x6(Test_E23x6, "E23x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E23x6C1Ev();
extern void _ZN5E23x6D1Ev();
Name_Map name_map_E23x6[] = {
  NSPAIR(_ZN5E23x6C1Ev),
  NSPAIR(_ZN5E23x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E23x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E23x6[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV5E23x6[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__5E23x6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x6[] = {
  {&(_ZTV5E23x6[4]),  4,9},
  {&(_tg__ZTV3C23__5E23x6[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__5E23x6[3]),  3,4},
  {&(_ZTV5E23x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
static VTBL_ENTRY alt_thunk_names143[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x6 = {  "E23x6", // class name
  bases_E23x6, 4,
  &(vtc_E23x6[0]), // expected_vtbl_contents
  &(vtt_E23x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E23x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E23x6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E23x6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names143,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y0  : E23x6 , F1 {
  int ff;
  ~G23x6y0(); // tgen
  G23x6y0(); // tgen
};
//SIG(1 G23x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x6y0 ::~G23x6y0(){ note_dtor("G23x6y0", this);} // tgen
G23x6y0 ::G23x6y0(){ note_ctor("G23x6y0", this);} // tgen

static void Test_G23x6y0()
{
  extern Class_Descriptor cd_G23x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x6y0, buf);
    G23x6y0 *dp, &lv = *(dp=new (buf) G23x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y0)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(40,28), "G23x6y0");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), 0, "G23x6y0");
    check_base_class_offset(lv, (C23*)(E23x6*), 0, "G23x6y0");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(52,36), "G23x6y0");
    check_base_class_offset(lv, (E23x6*), 0, "G23x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G23x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G23x6y0.ff");
    test_class_info(&lv, &cd_G23x6y0);
    dp->~G23x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y0(Test_G23x6y0, "G23x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x6y0C1Ev();
extern void _ZN7G23x6y0D1Ev();
Name_Map name_map_G23x6y0[] = {
  NSPAIR(_ZN7G23x6y0C1Ev),
  NSPAIR(_ZN7G23x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y0[];
extern void _ZN3C233fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y0[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G23x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x6y0[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y0[] = {
  {&(_ZTV7G23x6y0[4]),  4,12},
  {&(_tg__ZTV5E23x6__7G23x6y0[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y0[3]),  3,4},
  {&(_ZTV7G23x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G23x6y0[];
extern  VTBL_ENTRY _ZTV7G23x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y0[];
static VTBL_ENTRY alt_thunk_names144[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C233fooEv,_ZThn28_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y0 = {  "G23x6y0", // class name
  bases_G23x6y0, 6,
  &(vtc_G23x6y0[0]), // expected_vtbl_contents
  &(vtt_G23x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names144,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y1  : virtual E23x6 , F1 {
  int ff;
  ~G23x6y1(); // tgen
  G23x6y1(); // tgen
};
//SIG(1 G23x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x6y1 ::~G23x6y1(){ note_dtor("G23x6y1", this);} // tgen
G23x6y1 ::G23x6y1(){ note_ctor("G23x6y1", this);} // tgen

static void Test_G23x6y1()
{
  extern Class_Descriptor cd_G23x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x6y1, buf);
    G23x6y1 *dp, &lv = *(dp=new (buf) G23x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y1)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(40,28), "G23x6y1");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), ABISELECT(16,12), "G23x6y1");
    check_base_class_offset(lv, (C23*)(E23x6*), ABISELECT(16,12), "G23x6y1");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(52,36), "G23x6y1");
    check_base_class_offset(lv, (E23x6*), ABISELECT(16,12), "G23x6y1");
    check_base_class_offset(lv, (F1*), 0, "G23x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x6y1.ff");
    test_class_info(&lv, &cd_G23x6y1);
    dp->~G23x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y1(Test_G23x6y1, "G23x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x6y1C1Ev();
extern void _ZN7G23x6y1D1Ev();
Name_Map name_map_G23x6y1[] = {
  NSPAIR(_ZN7G23x6y1C1Ev),
  NSPAIR(_ZN7G23x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x6y1[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x6y1[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y1[] = {
  {&(_ZTV7G23x6y1[5]),  5,16},
  {&(_ZTV7G23x6y1[11]),  11,16},
  {&(_ZTV7G23x6y1[15]),  15,16},
  {&(_tg__ZTV5E23x6__7G23x6y1[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x6y1[];
extern  VTBL_ENTRY _ZTV7G23x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y1[];
static VTBL_ENTRY alt_thunk_names145[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y1 = {  "G23x6y1", // class name
  bases_G23x6y1, 6,
  &(vtc_G23x6y1[0]), // expected_vtbl_contents
  &(vtt_G23x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names145,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y2  : E23x6 , virtual F1 {
  int ff;
  ~G23x6y2(); // tgen
  G23x6y2(); // tgen
};
//SIG(1 G23x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x6y2 ::~G23x6y2(){ note_dtor("G23x6y2", this);} // tgen
G23x6y2 ::G23x6y2(){ note_ctor("G23x6y2", this);} // tgen

static void Test_G23x6y2()
{
  extern Class_Descriptor cd_G23x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x6y2, buf);
    G23x6y2 *dp, &lv = *(dp=new (buf) G23x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y2)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(24,20), "G23x6y2");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), 0, "G23x6y2");
    check_base_class_offset(lv, (C23*)(E23x6*), 0, "G23x6y2");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(36,28), "G23x6y2");
    check_base_class_offset(lv, (E23x6*), 0, "G23x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G23x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G23x6y2.ff");
    test_class_info(&lv, &cd_G23x6y2);
    dp->~G23x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y2(Test_G23x6y2, "G23x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x6y2C1Ev();
extern void _ZN7G23x6y2D1Ev();
Name_Map name_map_G23x6y2[] = {
  NSPAIR(_ZN7G23x6y2C1Ev),
  NSPAIR(_ZN7G23x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y2[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y2[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G23x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G23x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x6y2[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y2[] = {
  {&(_ZTV7G23x6y2[5]),  5,14},
  {&(_tg__ZTV5E23x6__7G23x6y2[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y2[3]),  3,4},
  {&(_ZTV7G23x6y2[9]),  9,14},
  {&(_ZTV7G23x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G23x6y2[];
extern  VTBL_ENTRY _ZTV7G23x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y2[];
static VTBL_ENTRY alt_thunk_names146[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y2 = {  "G23x6y2", // class name
  bases_G23x6y2, 6,
  &(vtc_G23x6y2[0]), // expected_vtbl_contents
  &(vtt_G23x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names146,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y3  : virtual E23x6 , virtual F1 {
  int ff;
  ~G23x6y3(); // tgen
  G23x6y3(); // tgen
};
//SIG(1 G23x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x6y3 ::~G23x6y3(){ note_dtor("G23x6y3", this);} // tgen
G23x6y3 ::G23x6y3(){ note_ctor("G23x6y3", this);} // tgen

static void Test_G23x6y3()
{
  extern Class_Descriptor cd_G23x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x6y3, buf);
    G23x6y3 *dp, &lv = *(dp=new (buf) G23x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y3)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(40,24), "G23x6y3");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), ABISELECT(16,8), "G23x6y3");
    check_base_class_offset(lv, (C23*)(E23x6*), ABISELECT(16,8), "G23x6y3");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(52,32), "G23x6y3");
    check_base_class_offset(lv, (E23x6*), ABISELECT(16,8), "G23x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G23x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x6y3.ff");
    test_class_info(&lv, &cd_G23x6y3);
    dp->~G23x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y3(Test_G23x6y3, "G23x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G23x6y3C1Ev();
extern void _ZN7G23x6y3D1Ev();
Name_Map name_map_G23x6y3[] = {
  NSPAIR(_ZN7G23x6y3C1Ev),
  NSPAIR(_ZN7G23x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y3[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x6y3[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G23x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G23x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x6y3[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y3[] = {
  {&(_ZTV7G23x6y3[6]),  6,20},
  {&(_ZTV7G23x6y3[11]),  11,20},
  {&(_ZTV7G23x6y3[15]),  15,20},
  {&(_ZTV7G23x6y3[19]),  19,20},
  {&(_tg__ZTV5E23x6__7G23x6y3[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x6y3[];
extern  VTBL_ENTRY _ZTV7G23x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y3[];
static VTBL_ENTRY alt_thunk_names147[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y3 = {  "G23x6y3", // class name
  bases_G23x6y3, 6,
  &(vtc_G23x6y3[0]), // expected_vtbl_contents
  &(vtt_G23x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G23x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names147,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y4  : E23x6 , F0 {
  int ff;
  ~G23x6y4(); // tgen
  G23x6y4(); // tgen
};
//SIG(1 G23x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G23x6y4 ::~G23x6y4(){ note_dtor("G23x6y4", this);} // tgen
G23x6y4 ::G23x6y4(){ note_ctor("G23x6y4", this);} // tgen

static void Test_G23x6y4()
{
  extern Class_Descriptor cd_G23x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x6y4, buf);
    G23x6y4 *dp, &lv = *(dp=new (buf) G23x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y4)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(32,24), "G23x6y4");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), 0, "G23x6y4");
    check_base_class_offset(lv, (C23*)(E23x6*), 0, "G23x6y4");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(44,32), "G23x6y4");
    check_base_class_offset(lv, (E23x6*), 0, "G23x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G23x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G23x6y4.ff");
    test_class_info(&lv, &cd_G23x6y4);
    dp->~G23x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y4(Test_G23x6y4, "G23x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G23x6y4C1Ev();
extern void _ZN7G23x6y4D1Ev();
Name_Map name_map_G23x6y4[] = {
  NSPAIR(_ZN7G23x6y4C1Ev),
  NSPAIR(_ZN7G23x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y4[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x6y4[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y4[] = {
  {&(_ZTV7G23x6y4[4]),  4,9},
  {&(_tg__ZTV5E23x6__7G23x6y4[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y4[3]),  3,4},
  {&(_ZTV7G23x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G23x6y4[];
extern  VTBL_ENTRY _ZTV7G23x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y4[];
static VTBL_ENTRY alt_thunk_names148[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C233fooEv,_ZThn24_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y4 = {  "G23x6y4", // class name
  bases_G23x6y4, 6,
  &(vtc_G23x6y4[0]), // expected_vtbl_contents
  &(vtt_G23x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G23x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names148,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y5  : virtual E23x6 , F0 {
  int ff;
  ~G23x6y5(); // tgen
  G23x6y5(); // tgen
};
//SIG(1 G23x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G23x6y5 ::~G23x6y5(){ note_dtor("G23x6y5", this);} // tgen
G23x6y5 ::G23x6y5(){ note_ctor("G23x6y5", this);} // tgen

static void Test_G23x6y5()
{
  extern Class_Descriptor cd_G23x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x6y5, buf);
    G23x6y5 *dp, &lv = *(dp=new (buf) G23x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y5)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(40,28), "G23x6y5");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), ABISELECT(16,12), "G23x6y5");
    check_base_class_offset(lv, (C23*)(E23x6*), ABISELECT(16,12), "G23x6y5");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(52,36), "G23x6y5");
    check_base_class_offset(lv, (E23x6*), ABISELECT(16,12), "G23x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x6y5.ff");
    test_class_info(&lv, &cd_G23x6y5);
    dp->~G23x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y5(Test_G23x6y5, "G23x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x6y5C1Ev();
extern void _ZN7G23x6y5D1Ev();
Name_Map name_map_G23x6y5[] = {
  NSPAIR(_ZN7G23x6y5C1Ev),
  NSPAIR(_ZN7G23x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y5[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x6y5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x6y5[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y5[] = {
  {&(_ZTV7G23x6y5[5]),  5,15},
  {&(_ZTV7G23x6y5[10]),  10,15},
  {&(_ZTV7G23x6y5[14]),  14,15},
  {&(_tg__ZTV5E23x6__7G23x6y5[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x6y5[];
extern  VTBL_ENTRY _ZTV7G23x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y5[];
static VTBL_ENTRY alt_thunk_names149[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y5 = {  "G23x6y5", // class name
  bases_G23x6y5, 6,
  &(vtc_G23x6y5[0]), // expected_vtbl_contents
  &(vtt_G23x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names149,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y6  : E23x6 , virtual F0 {
  int ff;
  ~G23x6y6(); // tgen
  G23x6y6(); // tgen
};
//SIG(1 G23x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x6y6 ::~G23x6y6(){ note_dtor("G23x6y6", this);} // tgen
G23x6y6 ::G23x6y6(){ note_ctor("G23x6y6", this);} // tgen

static void Test_G23x6y6()
{
  extern Class_Descriptor cd_G23x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G23x6y6, buf);
    G23x6y6 *dp, &lv = *(dp=new (buf) G23x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G23x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y6)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(24,20), "G23x6y6");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), 0, "G23x6y6");
    check_base_class_offset(lv, (C23*)(E23x6*), 0, "G23x6y6");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(36,28), "G23x6y6");
    check_base_class_offset(lv, (E23x6*), 0, "G23x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G23x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G23x6y6.ff");
    test_class_info(&lv, &cd_G23x6y6);
    dp->~G23x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y6(Test_G23x6y6, "G23x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G23x6y6C1Ev();
extern void _ZN7G23x6y6D1Ev();
Name_Map name_map_G23x6y6[] = {
  NSPAIR(_ZN7G23x6y6C1Ev),
  NSPAIR(_ZN7G23x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y6[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G23x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x6y6[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y6[] = {
  {&(_ZTV7G23x6y6[5]),  5,10},
  {&(_tg__ZTV5E23x6__7G23x6y6[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y6[3]),  3,4},
  {&(_ZTV7G23x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G23x6y6[];
extern  VTBL_ENTRY _ZTV7G23x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y6[];
static VTBL_ENTRY alt_thunk_names150[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn20_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y6 = {  "G23x6y6", // class name
  bases_G23x6y6, 6,
  &(vtc_G23x6y6[0]), // expected_vtbl_contents
  &(vtt_G23x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G23x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names150,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x6y7  : virtual E23x6 , virtual F0 {
  int ff;
  ~G23x6y7(); // tgen
  G23x6y7(); // tgen
};
//SIG(1 G23x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x6y7 ::~G23x6y7(){ note_dtor("G23x6y7", this);} // tgen
G23x6y7 ::G23x6y7(){ note_ctor("G23x6y7", this);} // tgen

static void Test_G23x6y7()
{
  extern Class_Descriptor cd_G23x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G23x6y7, buf);
    G23x6y7 *dp, &lv = *(dp=new (buf) G23x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G23x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x6y7)");
    check_base_class_offset(lv, (A1*)(C23*)(E23x6*), ABISELECT(40,24), "G23x6y7");
    check_base_class_offset(lv, (B1*)(C23*)(E23x6*), ABISELECT(16,8), "G23x6y7");
    check_base_class_offset(lv, (C23*)(E23x6*), ABISELECT(16,8), "G23x6y7");
    check_base_class_offset(lv, (D0*)(E23x6*), ABISELECT(52,32), "G23x6y7");
    check_base_class_offset(lv, (E23x6*), ABISELECT(16,8), "G23x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G23x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x6y7.ff");
    test_class_info(&lv, &cd_G23x6y7);
    dp->~G23x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x6y7(Test_G23x6y7, "G23x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G23x6y7C1Ev();
extern void _ZN7G23x6y7D1Ev();
Name_Map name_map_G23x6y7[] = {
  NSPAIR(_ZN7G23x6y7C1Ev),
  NSPAIR(_ZN7G23x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x6;
extern VTBL_ENTRY _ZTI5E23x6[];
extern  VTBL_ENTRY _ZTV5E23x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x6y7[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x6y7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G23x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x6y7[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV5E23x6__7G23x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C235E23x6__7G23x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C235E23x6__7G23x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x6__7G23x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x6y7[] = {
  {&(_ZTV7G23x6y7[6]),  6,16},
  {&(_ZTV7G23x6y7[11]),  11,16},
  {&(_ZTV7G23x6y7[15]),  15,16},
  {&(_tg__ZTV5E23x6__7G23x6y7[4]),  4,5},
  {&(_tg__ZTV3C235E23x6__7G23x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C235E23x6__7G23x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E23x6__7G23x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x6y7[];
extern  VTBL_ENTRY _ZTV7G23x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x6y7[];
static VTBL_ENTRY alt_thunk_names151[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C233fooEv,_ZThn16_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x6y7 = {  "G23x6y7", // class name
  bases_G23x6y7, 6,
  &(vtc_G23x6y7[0]), // expected_vtbl_contents
  &(vtt_G23x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G23x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x6y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x6y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names151,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x6  : C24 , virtual D0 {
  int fd;
  ~E24x6(); // tgen
  E24x6(); // tgen
};
//SIG(-1 E24x6) C1{ BC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E24x6 ::~E24x6(){ note_dtor("E24x6", this);} // tgen
E24x6 ::E24x6(){ note_ctor("E24x6", this);} // tgen

static void Test_E24x6()
{
  extern Class_Descriptor cd_E24x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E24x6, buf);
    E24x6 *dp, &lv = *(dp=new (buf) E24x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E24x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x6)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(8,4), "E24x6");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(20,16), "E24x6");
    check_base_class_offset(lv, (C24*), 0, "E24x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E24x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E24x6.fd");
    test_class_info(&lv, &cd_E24x6);
    dp->~E24x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x6(Test_E24x6, "E24x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E24x6C1Ev();
extern void _ZN5E24x6D1Ev();
Name_Map name_map_E24x6[] = {
  NSPAIR(_ZN5E24x6C1Ev),
  NSPAIR(_ZN5E24x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E24x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E24x6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_E24x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV5E24x6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x6[] = {
  {&(_ZTV5E24x6[4]),  4,5},
  {&(_tg__ZTV3C24__5E24x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
Class_Descriptor cd_E24x6 = {  "E24x6", // class name
  bases_E24x6, 4,
  &(vtc_E24x6[0]), // expected_vtbl_contents
  &(vtt_E24x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E24x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E24x6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E24x6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y0  : E24x6 , F1 {
  int ff;
  ~G24x6y0(); // tgen
  G24x6y0(); // tgen
};
//SIG(1 G24x6y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x6y0 ::~G24x6y0(){ note_dtor("G24x6y0", this);} // tgen
G24x6y0 ::G24x6y0(){ note_ctor("G24x6y0", this);} // tgen

static void Test_G24x6y0()
{
  extern Class_Descriptor cd_G24x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x6y0, buf);
    G24x6y0 *dp, &lv = *(dp=new (buf) G24x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y0)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(8,4), "G24x6y0");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(40,28), "G24x6y0");
    check_base_class_offset(lv, (C24*)(E24x6*), 0, "G24x6y0");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(44,32), "G24x6y0");
    check_base_class_offset(lv, (E24x6*), 0, "G24x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G24x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G24x6y0.ff");
    test_class_info(&lv, &cd_G24x6y0);
    dp->~G24x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y0(Test_G24x6y0, "G24x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x6y0C1Ev();
extern void _ZN7G24x6y0D1Ev();
Name_Map name_map_G24x6y0[] = {
  NSPAIR(_ZN7G24x6y0C1Ev),
  NSPAIR(_ZN7G24x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y0[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y0[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G24x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y0[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y0[] = {
  {&(_ZTV7G24x6y0[4]),  4,8},
  {&(_tg__ZTV5E24x6__7G24x6y0[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y0[];
extern  VTBL_ENTRY _ZTV7G24x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y0[];
Class_Descriptor cd_G24x6y0 = {  "G24x6y0", // class name
  bases_G24x6y0, 6,
  &(vtc_G24x6y0[0]), // expected_vtbl_contents
  &(vtt_G24x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y1  : virtual E24x6 , F1 {
  int ff;
  ~G24x6y1(); // tgen
  G24x6y1(); // tgen
};
//SIG(1 G24x6y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x6y1 ::~G24x6y1(){ note_dtor("G24x6y1", this);} // tgen
G24x6y1 ::G24x6y1(){ note_ctor("G24x6y1", this);} // tgen

static void Test_G24x6y1()
{
  extern Class_Descriptor cd_G24x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x6y1, buf);
    G24x6y1 *dp, &lv = *(dp=new (buf) G24x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y1)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(24,16), "G24x6y1");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(36,28), "G24x6y1");
    check_base_class_offset(lv, (C24*)(E24x6*), ABISELECT(16,12), "G24x6y1");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(40,32), "G24x6y1");
    check_base_class_offset(lv, (E24x6*), ABISELECT(16,12), "G24x6y1");
    check_base_class_offset(lv, (F1*), 0, "G24x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x6y1.ff");
    test_class_info(&lv, &cd_G24x6y1);
    dp->~G24x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y1(Test_G24x6y1, "G24x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x6y1C1Ev();
extern void _ZN7G24x6y1D1Ev();
Name_Map name_map_G24x6y1[] = {
  NSPAIR(_ZN7G24x6y1C1Ev),
  NSPAIR(_ZN7G24x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x6y1[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y1[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y1[] = {
  {&(_ZTV7G24x6y1[5]),  5,12},
  {&(_ZTV7G24x6y1[11]),  11,12},
  {&(_tg__ZTV5E24x6__7G24x6y1[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y1[];
extern  VTBL_ENTRY _ZTV7G24x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y1[];
Class_Descriptor cd_G24x6y1 = {  "G24x6y1", // class name
  bases_G24x6y1, 6,
  &(vtc_G24x6y1[0]), // expected_vtbl_contents
  &(vtt_G24x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y2  : E24x6 , virtual F1 {
  int ff;
  ~G24x6y2(); // tgen
  G24x6y2(); // tgen
};
//SIG(1 G24x6y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x6y2 ::~G24x6y2(){ note_dtor("G24x6y2", this);} // tgen
G24x6y2 ::G24x6y2(){ note_ctor("G24x6y2", this);} // tgen

static void Test_G24x6y2()
{
  extern Class_Descriptor cd_G24x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x6y2, buf);
    G24x6y2 *dp, &lv = *(dp=new (buf) G24x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y2)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(8,4), "G24x6y2");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(24,20), "G24x6y2");
    check_base_class_offset(lv, (C24*)(E24x6*), 0, "G24x6y2");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(28,24), "G24x6y2");
    check_base_class_offset(lv, (E24x6*), 0, "G24x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G24x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G24x6y2.ff");
    test_class_info(&lv, &cd_G24x6y2);
    dp->~G24x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y2(Test_G24x6y2, "G24x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x6y2C1Ev();
extern void _ZN7G24x6y2D1Ev();
Name_Map name_map_G24x6y2[] = {
  NSPAIR(_ZN7G24x6y2C1Ev),
  NSPAIR(_ZN7G24x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y2[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y2[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G24x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y2[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y2[] = {
  {&(_ZTV7G24x6y2[5]),  5,10},
  {&(_tg__ZTV5E24x6__7G24x6y2[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y2[3]),  3,4},
  {&(_ZTV7G24x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G24x6y2[];
extern  VTBL_ENTRY _ZTV7G24x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y2[];
Class_Descriptor cd_G24x6y2 = {  "G24x6y2", // class name
  bases_G24x6y2, 6,
  &(vtc_G24x6y2[0]), // expected_vtbl_contents
  &(vtt_G24x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y3  : virtual E24x6 , virtual F1 {
  int ff;
  ~G24x6y3(); // tgen
  G24x6y3(); // tgen
};
//SIG(1 G24x6y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x6y3 ::~G24x6y3(){ note_dtor("G24x6y3", this);} // tgen
G24x6y3 ::G24x6y3(){ note_ctor("G24x6y3", this);} // tgen

static void Test_G24x6y3()
{
  extern Class_Descriptor cd_G24x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x6y3, buf);
    G24x6y3 *dp, &lv = *(dp=new (buf) G24x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y3)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(24,12), "G24x6y3");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(36,24), "G24x6y3");
    check_base_class_offset(lv, (C24*)(E24x6*), ABISELECT(16,8), "G24x6y3");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(40,28), "G24x6y3");
    check_base_class_offset(lv, (E24x6*), ABISELECT(16,8), "G24x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G24x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x6y3.ff");
    test_class_info(&lv, &cd_G24x6y3);
    dp->~G24x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y3(Test_G24x6y3, "G24x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G24x6y3C1Ev();
extern void _ZN7G24x6y3D1Ev();
Name_Map name_map_G24x6y3[] = {
  NSPAIR(_ZN7G24x6y3C1Ev),
  NSPAIR(_ZN7G24x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y3[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x6y3[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G24x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y3[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y3[] = {
  {&(_ZTV7G24x6y3[6]),  6,16},
  {&(_ZTV7G24x6y3[11]),  11,16},
  {&(_ZTV7G24x6y3[15]),  15,16},
  {&(_tg__ZTV5E24x6__7G24x6y3[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y3[];
extern  VTBL_ENTRY _ZTV7G24x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y3[];
Class_Descriptor cd_G24x6y3 = {  "G24x6y3", // class name
  bases_G24x6y3, 6,
  &(vtc_G24x6y3[0]), // expected_vtbl_contents
  &(vtt_G24x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G24x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y4  : E24x6 , F0 {
  int ff;
  ~G24x6y4(); // tgen
  G24x6y4(); // tgen
};
//SIG(1 G24x6y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G24x6y4 ::~G24x6y4(){ note_dtor("G24x6y4", this);} // tgen
G24x6y4 ::G24x6y4(){ note_ctor("G24x6y4", this);} // tgen

static void Test_G24x6y4()
{
  extern Class_Descriptor cd_G24x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x6y4, buf);
    G24x6y4 *dp, &lv = *(dp=new (buf) G24x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y4)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(8,4), "G24x6y4");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(28,24), "G24x6y4");
    check_base_class_offset(lv, (C24*)(E24x6*), 0, "G24x6y4");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(32,28), "G24x6y4");
    check_base_class_offset(lv, (E24x6*), 0, "G24x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G24x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G24x6y4.ff");
    test_class_info(&lv, &cd_G24x6y4);
    dp->~G24x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y4(Test_G24x6y4, "G24x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G24x6y4C1Ev();
extern void _ZN7G24x6y4D1Ev();
Name_Map name_map_G24x6y4[] = {
  NSPAIR(_ZN7G24x6y4C1Ev),
  NSPAIR(_ZN7G24x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y4[] = {
  {&(_ZTV7G24x6y4[4]),  4,5},
  {&(_tg__ZTV5E24x6__7G24x6y4[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y4[];
extern  VTBL_ENTRY _ZTV7G24x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y4[];
Class_Descriptor cd_G24x6y4 = {  "G24x6y4", // class name
  bases_G24x6y4, 6,
  &(vtc_G24x6y4[0]), // expected_vtbl_contents
  &(vtt_G24x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G24x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y5  : virtual E24x6 , F0 {
  int ff;
  ~G24x6y5(); // tgen
  G24x6y5(); // tgen
};
//SIG(1 G24x6y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G24x6y5 ::~G24x6y5(){ note_dtor("G24x6y5", this);} // tgen
G24x6y5 ::G24x6y5(){ note_ctor("G24x6y5", this);} // tgen

static void Test_G24x6y5()
{
  extern Class_Descriptor cd_G24x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x6y5, buf);
    G24x6y5 *dp, &lv = *(dp=new (buf) G24x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y5)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(24,16), "G24x6y5");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(36,28), "G24x6y5");
    check_base_class_offset(lv, (C24*)(E24x6*), ABISELECT(16,12), "G24x6y5");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(40,32), "G24x6y5");
    check_base_class_offset(lv, (E24x6*), ABISELECT(16,12), "G24x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x6y5.ff");
    test_class_info(&lv, &cd_G24x6y5);
    dp->~G24x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y5(Test_G24x6y5, "G24x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x6y5C1Ev();
extern void _ZN7G24x6y5D1Ev();
Name_Map name_map_G24x6y5[] = {
  NSPAIR(_ZN7G24x6y5C1Ev),
  NSPAIR(_ZN7G24x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x6y5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y5[] = {
  {&(_ZTV7G24x6y5[5]),  5,11},
  {&(_ZTV7G24x6y5[10]),  10,11},
  {&(_tg__ZTV5E24x6__7G24x6y5[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y5[];
extern  VTBL_ENTRY _ZTV7G24x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y5[];
Class_Descriptor cd_G24x6y5 = {  "G24x6y5", // class name
  bases_G24x6y5, 6,
  &(vtc_G24x6y5[0]), // expected_vtbl_contents
  &(vtt_G24x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y6  : E24x6 , virtual F0 {
  int ff;
  ~G24x6y6(); // tgen
  G24x6y6(); // tgen
};
//SIG(1 G24x6y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x6y6 ::~G24x6y6(){ note_dtor("G24x6y6", this);} // tgen
G24x6y6 ::G24x6y6(){ note_ctor("G24x6y6", this);} // tgen

static void Test_G24x6y6()
{
  extern Class_Descriptor cd_G24x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G24x6y6, buf);
    G24x6y6 *dp, &lv = *(dp=new (buf) G24x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G24x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y6)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(8,4), "G24x6y6");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(24,20), "G24x6y6");
    check_base_class_offset(lv, (C24*)(E24x6*), 0, "G24x6y6");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(28,24), "G24x6y6");
    check_base_class_offset(lv, (E24x6*), 0, "G24x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G24x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G24x6y6.ff");
    test_class_info(&lv, &cd_G24x6y6);
    dp->~G24x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y6(Test_G24x6y6, "G24x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G24x6y6C1Ev();
extern void _ZN7G24x6y6D1Ev();
Name_Map name_map_G24x6y6[] = {
  NSPAIR(_ZN7G24x6y6C1Ev),
  NSPAIR(_ZN7G24x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y6[] = {
  {&(_ZTV7G24x6y6[5]),  5,6},
  {&(_tg__ZTV5E24x6__7G24x6y6[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y6[];
extern  VTBL_ENTRY _ZTV7G24x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y6[];
Class_Descriptor cd_G24x6y6 = {  "G24x6y6", // class name
  bases_G24x6y6, 6,
  &(vtc_G24x6y6[0]), // expected_vtbl_contents
  &(vtt_G24x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G24x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x6y7  : virtual E24x6 , virtual F0 {
  int ff;
  ~G24x6y7(); // tgen
  G24x6y7(); // tgen
};
//SIG(1 G24x6y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x6y7 ::~G24x6y7(){ note_dtor("G24x6y7", this);} // tgen
G24x6y7 ::G24x6y7(){ note_ctor("G24x6y7", this);} // tgen

static void Test_G24x6y7()
{
  extern Class_Descriptor cd_G24x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x6y7, buf);
    G24x6y7 *dp, &lv = *(dp=new (buf) G24x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x6y7)");
    check_base_class_offset(lv, (A0*)(C24*)(E24x6*), ABISELECT(24,12), "G24x6y7");
    check_base_class_offset(lv, (B0*)(C24*)(E24x6*), ABISELECT(36,24), "G24x6y7");
    check_base_class_offset(lv, (C24*)(E24x6*), ABISELECT(16,8), "G24x6y7");
    check_base_class_offset(lv, (D0*)(E24x6*), ABISELECT(40,28), "G24x6y7");
    check_base_class_offset(lv, (E24x6*), ABISELECT(16,8), "G24x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G24x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x6y7.ff");
    test_class_info(&lv, &cd_G24x6y7);
    dp->~G24x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x6y7(Test_G24x6y7, "G24x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x6y7C1Ev();
extern void _ZN7G24x6y7D1Ev();
Name_Map name_map_G24x6y7[] = {
  NSPAIR(_ZN7G24x6y7C1Ev),
  NSPAIR(_ZN7G24x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x6;
extern VTBL_ENTRY _ZTI5E24x6[];
extern  VTBL_ENTRY _ZTV5E24x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x6y7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x6y7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x6y7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV5E24x6__7G24x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C245E24x6__7G24x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x6y7[] = {
  {&(_ZTV7G24x6y7[6]),  6,12},
  {&(_ZTV7G24x6y7[11]),  11,12},
  {&(_tg__ZTV5E24x6__7G24x6y7[4]),  4,5},
  {&(_tg__ZTV3C245E24x6__7G24x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x6y7[];
extern  VTBL_ENTRY _ZTV7G24x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x6y7[];
Class_Descriptor cd_G24x6y7 = {  "G24x6y7", // class name
  bases_G24x6y7, 6,
  &(vtc_G24x6y7[0]), // expected_vtbl_contents
  &(vtt_G24x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x6y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x6y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E25x6  : C25 , virtual D0 {
  int fd;
  ~E25x6(); // tgen
  E25x6(); // tgen
};
//SIG(-1 E25x6) C1{ BC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E25x6 ::~E25x6(){ note_dtor("E25x6", this);} // tgen
E25x6 ::E25x6(){ note_ctor("E25x6", this);} // tgen

static void Test_E25x6()
{
  extern Class_Descriptor cd_E25x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E25x6, buf);
    E25x6 *dp, &lv = *(dp=new (buf) E25x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E25x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x6)");
    check_base_class_offset(lv, (A1*)(C25*), 0, "E25x6");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(20,16), "E25x6");
    check_base_class_offset(lv, (C25*), 0, "E25x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E25x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E25x6.fd");
    test_class_info(&lv, &cd_E25x6);
    dp->~E25x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x6(Test_E25x6, "E25x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E25x6C1Ev();
extern void _ZN5E25x6D1Ev();
Name_Map name_map_E25x6[] = {
  NSPAIR(_ZN5E25x6C1Ev),
  NSPAIR(_ZN5E25x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E25x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E25x6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_E25x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV5E25x6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x6[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x6[] = {
  {&(_ZTV5E25x6[4]),  4,5},
  {&(_tg__ZTV3C25__5E25x6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
Class_Descriptor cd_E25x6 = {  "E25x6", // class name
  bases_E25x6, 4,
  &(vtc_E25x6[0]), // expected_vtbl_contents
  &(vtt_E25x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E25x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E25x6),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E25x6),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y0  : E25x6 , F1 {
  int ff;
  ~G25x6y0(); // tgen
  G25x6y0(); // tgen
};
//SIG(1 G25x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x6y0 ::~G25x6y0(){ note_dtor("G25x6y0", this);} // tgen
G25x6y0 ::G25x6y0(){ note_ctor("G25x6y0", this);} // tgen

static void Test_G25x6y0()
{
  extern Class_Descriptor cd_G25x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x6y0, buf);
    G25x6y0 *dp, &lv = *(dp=new (buf) G25x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y0)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), 0, "G25x6y0");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(40,28), "G25x6y0");
    check_base_class_offset(lv, (C25*)(E25x6*), 0, "G25x6y0");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(44,32), "G25x6y0");
    check_base_class_offset(lv, (E25x6*), 0, "G25x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G25x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G25x6y0.ff");
    test_class_info(&lv, &cd_G25x6y0);
    dp->~G25x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y0(Test_G25x6y0, "G25x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x6y0C1Ev();
extern void _ZN7G25x6y0D1Ev();
Name_Map name_map_G25x6y0[] = {
  NSPAIR(_ZN7G25x6y0C1Ev),
  NSPAIR(_ZN7G25x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y0[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y0[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G25x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y0[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y0[] = {
  {&(_ZTV7G25x6y0[4]),  4,8},
  {&(_tg__ZTV5E25x6__7G25x6y0[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y0[];
extern  VTBL_ENTRY _ZTV7G25x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y0[];
Class_Descriptor cd_G25x6y0 = {  "G25x6y0", // class name
  bases_G25x6y0, 6,
  &(vtc_G25x6y0[0]), // expected_vtbl_contents
  &(vtt_G25x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y0),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y0),3, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y1  : virtual E25x6 , F1 {
  int ff;
  ~G25x6y1(); // tgen
  G25x6y1(); // tgen
};
//SIG(1 G25x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x6y1 ::~G25x6y1(){ note_dtor("G25x6y1", this);} // tgen
G25x6y1 ::G25x6y1(){ note_ctor("G25x6y1", this);} // tgen

static void Test_G25x6y1()
{
  extern Class_Descriptor cd_G25x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x6y1, buf);
    G25x6y1 *dp, &lv = *(dp=new (buf) G25x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y1)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), ABISELECT(16,12), "G25x6y1");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(36,28), "G25x6y1");
    check_base_class_offset(lv, (C25*)(E25x6*), ABISELECT(16,12), "G25x6y1");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(40,32), "G25x6y1");
    check_base_class_offset(lv, (E25x6*), ABISELECT(16,12), "G25x6y1");
    check_base_class_offset(lv, (F1*), 0, "G25x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x6y1.ff");
    test_class_info(&lv, &cd_G25x6y1);
    dp->~G25x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y1(Test_G25x6y1, "G25x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x6y1C1Ev();
extern void _ZN7G25x6y1D1Ev();
Name_Map name_map_G25x6y1[] = {
  NSPAIR(_ZN7G25x6y1C1Ev),
  NSPAIR(_ZN7G25x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x6y1[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y1[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y1[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y1[] = {
  {&(_ZTV7G25x6y1[5]),  5,12},
  {&(_ZTV7G25x6y1[11]),  11,12},
  {&(_tg__ZTV5E25x6__7G25x6y1[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y1[];
extern  VTBL_ENTRY _ZTV7G25x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y1[];
Class_Descriptor cd_G25x6y1 = {  "G25x6y1", // class name
  bases_G25x6y1, 6,
  &(vtc_G25x6y1[0]), // expected_vtbl_contents
  &(vtt_G25x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y1),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y1),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y2  : E25x6 , virtual F1 {
  int ff;
  ~G25x6y2(); // tgen
  G25x6y2(); // tgen
};
//SIG(1 G25x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x6y2 ::~G25x6y2(){ note_dtor("G25x6y2", this);} // tgen
G25x6y2 ::G25x6y2(){ note_ctor("G25x6y2", this);} // tgen

static void Test_G25x6y2()
{
  extern Class_Descriptor cd_G25x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x6y2, buf);
    G25x6y2 *dp, &lv = *(dp=new (buf) G25x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y2)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), 0, "G25x6y2");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(24,20), "G25x6y2");
    check_base_class_offset(lv, (C25*)(E25x6*), 0, "G25x6y2");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(28,24), "G25x6y2");
    check_base_class_offset(lv, (E25x6*), 0, "G25x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G25x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G25x6y2.ff");
    test_class_info(&lv, &cd_G25x6y2);
    dp->~G25x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y2(Test_G25x6y2, "G25x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x6y2C1Ev();
extern void _ZN7G25x6y2D1Ev();
Name_Map name_map_G25x6y2[] = {
  NSPAIR(_ZN7G25x6y2C1Ev),
  NSPAIR(_ZN7G25x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y2[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y2[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G25x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y2[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y2[] = {
  {&(_ZTV7G25x6y2[5]),  5,10},
  {&(_tg__ZTV5E25x6__7G25x6y2[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y2[3]),  3,4},
  {&(_ZTV7G25x6y2[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G25x6y2[];
extern  VTBL_ENTRY _ZTV7G25x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y2[];
Class_Descriptor cd_G25x6y2 = {  "G25x6y2", // class name
  bases_G25x6y2, 6,
  &(vtc_G25x6y2[0]), // expected_vtbl_contents
  &(vtt_G25x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y2),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y2),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y3  : virtual E25x6 , virtual F1 {
  int ff;
  ~G25x6y3(); // tgen
  G25x6y3(); // tgen
};
//SIG(1 G25x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x6y3 ::~G25x6y3(){ note_dtor("G25x6y3", this);} // tgen
G25x6y3 ::G25x6y3(){ note_ctor("G25x6y3", this);} // tgen

static void Test_G25x6y3()
{
  extern Class_Descriptor cd_G25x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x6y3, buf);
    G25x6y3 *dp, &lv = *(dp=new (buf) G25x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y3)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), ABISELECT(16,8), "G25x6y3");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(36,24), "G25x6y3");
    check_base_class_offset(lv, (C25*)(E25x6*), ABISELECT(16,8), "G25x6y3");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(40,28), "G25x6y3");
    check_base_class_offset(lv, (E25x6*), ABISELECT(16,8), "G25x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G25x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x6y3.ff");
    test_class_info(&lv, &cd_G25x6y3);
    dp->~G25x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y3(Test_G25x6y3, "G25x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G25x6y3C1Ev();
extern void _ZN7G25x6y3D1Ev();
Name_Map name_map_G25x6y3[] = {
  NSPAIR(_ZN7G25x6y3C1Ev),
  NSPAIR(_ZN7G25x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y3[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x6y3[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G25x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y3[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y3[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y3[] = {
  {&(_ZTV7G25x6y3[6]),  6,16},
  {&(_ZTV7G25x6y3[11]),  11,16},
  {&(_ZTV7G25x6y3[15]),  15,16},
  {&(_tg__ZTV5E25x6__7G25x6y3[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y3[];
extern  VTBL_ENTRY _ZTV7G25x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y3[];
Class_Descriptor cd_G25x6y3 = {  "G25x6y3", // class name
  bases_G25x6y3, 6,
  &(vtc_G25x6y3[0]), // expected_vtbl_contents
  &(vtt_G25x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G25x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y3),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y3),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y4  : E25x6 , F0 {
  int ff;
  ~G25x6y4(); // tgen
  G25x6y4(); // tgen
};
//SIG(1 G25x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G25x6y4 ::~G25x6y4(){ note_dtor("G25x6y4", this);} // tgen
G25x6y4 ::G25x6y4(){ note_ctor("G25x6y4", this);} // tgen

static void Test_G25x6y4()
{
  extern Class_Descriptor cd_G25x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x6y4, buf);
    G25x6y4 *dp, &lv = *(dp=new (buf) G25x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y4)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), 0, "G25x6y4");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(28,24), "G25x6y4");
    check_base_class_offset(lv, (C25*)(E25x6*), 0, "G25x6y4");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(32,28), "G25x6y4");
    check_base_class_offset(lv, (E25x6*), 0, "G25x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G25x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G25x6y4.ff");
    test_class_info(&lv, &cd_G25x6y4);
    dp->~G25x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y4(Test_G25x6y4, "G25x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G25x6y4C1Ev();
extern void _ZN7G25x6y4D1Ev();
Name_Map name_map_G25x6y4[] = {
  NSPAIR(_ZN7G25x6y4C1Ev),
  NSPAIR(_ZN7G25x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y4[] = {
  ABISELECT(28,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y4[] = {
  {&(_ZTV7G25x6y4[4]),  4,5},
  {&(_tg__ZTV5E25x6__7G25x6y4[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y4[];
extern  VTBL_ENTRY _ZTV7G25x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y4[];
Class_Descriptor cd_G25x6y4 = {  "G25x6y4", // class name
  bases_G25x6y4, 6,
  &(vtc_G25x6y4[0]), // expected_vtbl_contents
  &(vtt_G25x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G25x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y4),5, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y4),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y5  : virtual E25x6 , F0 {
  int ff;
  ~G25x6y5(); // tgen
  G25x6y5(); // tgen
};
//SIG(1 G25x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G25x6y5 ::~G25x6y5(){ note_dtor("G25x6y5", this);} // tgen
G25x6y5 ::G25x6y5(){ note_ctor("G25x6y5", this);} // tgen

static void Test_G25x6y5()
{
  extern Class_Descriptor cd_G25x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x6y5, buf);
    G25x6y5 *dp, &lv = *(dp=new (buf) G25x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y5)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), ABISELECT(16,12), "G25x6y5");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(36,28), "G25x6y5");
    check_base_class_offset(lv, (C25*)(E25x6*), ABISELECT(16,12), "G25x6y5");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(40,32), "G25x6y5");
    check_base_class_offset(lv, (E25x6*), ABISELECT(16,12), "G25x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x6y5.ff");
    test_class_info(&lv, &cd_G25x6y5);
    dp->~G25x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y5(Test_G25x6y5, "G25x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x6y5C1Ev();
extern void _ZN7G25x6y5D1Ev();
Name_Map name_map_G25x6y5[] = {
  NSPAIR(_ZN7G25x6y5C1Ev),
  NSPAIR(_ZN7G25x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x6y5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y5[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y5[] = {
  {&(_ZTV7G25x6y5[5]),  5,11},
  {&(_ZTV7G25x6y5[10]),  10,11},
  {&(_tg__ZTV5E25x6__7G25x6y5[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y5[];
extern  VTBL_ENTRY _ZTV7G25x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y5[];
Class_Descriptor cd_G25x6y5 = {  "G25x6y5", // class name
  bases_G25x6y5, 6,
  &(vtc_G25x6y5[0]), // expected_vtbl_contents
  &(vtt_G25x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y5),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y5),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y6  : E25x6 , virtual F0 {
  int ff;
  ~G25x6y6(); // tgen
  G25x6y6(); // tgen
};
//SIG(1 G25x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x6y6 ::~G25x6y6(){ note_dtor("G25x6y6", this);} // tgen
G25x6y6 ::G25x6y6(){ note_ctor("G25x6y6", this);} // tgen

static void Test_G25x6y6()
{
  extern Class_Descriptor cd_G25x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G25x6y6, buf);
    G25x6y6 *dp, &lv = *(dp=new (buf) G25x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G25x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y6)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), 0, "G25x6y6");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(24,20), "G25x6y6");
    check_base_class_offset(lv, (C25*)(E25x6*), 0, "G25x6y6");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(28,24), "G25x6y6");
    check_base_class_offset(lv, (E25x6*), 0, "G25x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G25x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G25x6y6.ff");
    test_class_info(&lv, &cd_G25x6y6);
    dp->~G25x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y6(Test_G25x6y6, "G25x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G25x6y6C1Ev();
extern void _ZN7G25x6y6D1Ev();
Name_Map name_map_G25x6y6[] = {
  NSPAIR(_ZN7G25x6y6C1Ev),
  NSPAIR(_ZN7G25x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y6[] = {
  {&(_ZTV7G25x6y6[5]),  5,6},
  {&(_tg__ZTV5E25x6__7G25x6y6[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y6[];
extern  VTBL_ENTRY _ZTV7G25x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y6[];
Class_Descriptor cd_G25x6y6 = {  "G25x6y6", // class name
  bases_G25x6y6, 6,
  &(vtc_G25x6y6[0]), // expected_vtbl_contents
  &(vtt_G25x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G25x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y6),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x6y7  : virtual E25x6 , virtual F0 {
  int ff;
  ~G25x6y7(); // tgen
  G25x6y7(); // tgen
};
//SIG(1 G25x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x6y7 ::~G25x6y7(){ note_dtor("G25x6y7", this);} // tgen
G25x6y7 ::G25x6y7(){ note_ctor("G25x6y7", this);} // tgen

static void Test_G25x6y7()
{
  extern Class_Descriptor cd_G25x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x6y7, buf);
    G25x6y7 *dp, &lv = *(dp=new (buf) G25x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x6y7)");
    check_base_class_offset(lv, (A1*)(C25*)(E25x6*), ABISELECT(16,8), "G25x6y7");
    check_base_class_offset(lv, (B0*)(C25*)(E25x6*), ABISELECT(36,24), "G25x6y7");
    check_base_class_offset(lv, (C25*)(E25x6*), ABISELECT(16,8), "G25x6y7");
    check_base_class_offset(lv, (D0*)(E25x6*), ABISELECT(40,28), "G25x6y7");
    check_base_class_offset(lv, (E25x6*), ABISELECT(16,8), "G25x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G25x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x6y7.ff");
    test_class_info(&lv, &cd_G25x6y7);
    dp->~G25x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x6y7(Test_G25x6y7, "G25x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x6y7C1Ev();
extern void _ZN7G25x6y7D1Ev();
Name_Map name_map_G25x6y7[] = {
  NSPAIR(_ZN7G25x6y7C1Ev),
  NSPAIR(_ZN7G25x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x6;
extern VTBL_ENTRY _ZTI5E25x6[];
extern  VTBL_ENTRY _ZTV5E25x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x6y7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x6y7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x6y7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV5E25x6__7G25x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C255E25x6__7G25x6y7[] = {
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x6y7[] = {
  {&(_ZTV7G25x6y7[6]),  6,12},
  {&(_ZTV7G25x6y7[11]),  11,12},
  {&(_tg__ZTV5E25x6__7G25x6y7[4]),  4,5},
  {&(_tg__ZTV3C255E25x6__7G25x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x6y7[];
extern  VTBL_ENTRY _ZTV7G25x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x6y7[];
Class_Descriptor cd_G25x6y7 = {  "G25x6y7", // class name
  bases_G25x6y7, 6,
  &(vtc_G25x6y7[0]), // expected_vtbl_contents
  &(vtt_G25x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x6y7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x6y7),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E26x6  : C26 , virtual D0 {
  int fd;
  ~E26x6(); // tgen
  E26x6(); // tgen
};
//SIG(-1 E26x6) C1{ BC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E26x6 ::~E26x6(){ note_dtor("E26x6", this);} // tgen
E26x6 ::E26x6(){ note_ctor("E26x6", this);} // tgen

static void Test_E26x6()
{
  extern Class_Descriptor cd_E26x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E26x6, buf);
    E26x6 *dp, &lv = *(dp=new (buf) E26x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E26x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x6)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(16,12), "E26x6");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(20,16), "E26x6");
    check_base_class_offset(lv, (C26*), 0, "E26x6");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E26x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E26x6.fd");
    test_class_info(&lv, &cd_E26x6);
    dp->~E26x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x6(Test_E26x6, "E26x6", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN5E26x6C1Ev();
extern void _ZN5E26x6D1Ev();
Name_Map name_map_E26x6[] = {
  NSPAIR(_ZN5E26x6C1Ev),
  NSPAIR(_ZN5E26x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E26x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E26x6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_E26x6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV5E26x6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x6[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x6[] = {
  {&(_ZTV5E26x6[5]),  5,6},
  {&(_tg__ZTV3C26__5E26x6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
Class_Descriptor cd_E26x6 = {  "E26x6", // class name
  bases_E26x6, 4,
  &(vtc_E26x6[0]), // expected_vtbl_contents
  &(vtt_E26x6[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI5E26x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E26x6),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E26x6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y0  : E26x6 , F1 {
  int ff;
  ~G26x6y0(); // tgen
  G26x6y0(); // tgen
};
//SIG(1 G26x6y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x6y0 ::~G26x6y0(){ note_dtor("G26x6y0", this);} // tgen
G26x6y0 ::G26x6y0(){ note_ctor("G26x6y0", this);} // tgen

static void Test_G26x6y0()
{
  extern Class_Descriptor cd_G26x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x6y0, buf);
    G26x6y0 *dp, &lv = *(dp=new (buf) G26x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y0)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(32,24), "G26x6y0");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(36,28), "G26x6y0");
    check_base_class_offset(lv, (C26*)(E26x6*), 0, "G26x6y0");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(40,32), "G26x6y0");
    check_base_class_offset(lv, (E26x6*), 0, "G26x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G26x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G26x6y0.ff");
    test_class_info(&lv, &cd_G26x6y0);
    dp->~G26x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y0(Test_G26x6y0, "G26x6y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x6y0C1Ev();
extern void _ZN7G26x6y0D1Ev();
Name_Map name_map_G26x6y0[] = {
  NSPAIR(_ZN7G26x6y0C1Ev),
  NSPAIR(_ZN7G26x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y0[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x6y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y0[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y0[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y0[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y0[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y0[] = {
  {&(_ZTV7G26x6y0[5]),  5,9},
  {&(_tg__ZTV5E26x6__7G26x6y0[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y0[];
extern  VTBL_ENTRY _ZTV7G26x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y0[];
Class_Descriptor cd_G26x6y0 = {  "G26x6y0", // class name
  bases_G26x6y0, 6,
  &(vtc_G26x6y0[0]), // expected_vtbl_contents
  &(vtt_G26x6y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y0),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y0),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y1  : virtual E26x6 , F1 {
  int ff;
  ~G26x6y1(); // tgen
  G26x6y1(); // tgen
};
//SIG(1 G26x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x6y1 ::~G26x6y1(){ note_dtor("G26x6y1", this);} // tgen
G26x6y1 ::G26x6y1(){ note_ctor("G26x6y1", this);} // tgen

static void Test_G26x6y1()
{
  extern Class_Descriptor cd_G26x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x6y1, buf);
    G26x6y1 *dp, &lv = *(dp=new (buf) G26x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y1)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(32,24), "G26x6y1");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(36,28), "G26x6y1");
    check_base_class_offset(lv, (C26*)(E26x6*), ABISELECT(16,12), "G26x6y1");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(40,32), "G26x6y1");
    check_base_class_offset(lv, (E26x6*), ABISELECT(16,12), "G26x6y1");
    check_base_class_offset(lv, (F1*), 0, "G26x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x6y1.ff");
    test_class_info(&lv, &cd_G26x6y1);
    dp->~G26x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y1(Test_G26x6y1, "G26x6y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x6y1C1Ev();
extern void _ZN7G26x6y1D1Ev();
Name_Map name_map_G26x6y1[] = {
  NSPAIR(_ZN7G26x6y1C1Ev),
  NSPAIR(_ZN7G26x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x6y1[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x6y1[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y1[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y1[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y1[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y1[] = {
  {&(_ZTV7G26x6y1[6]),  6,14},
  {&(_ZTV7G26x6y1[13]),  13,14},
  {&(_tg__ZTV5E26x6__7G26x6y1[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y1[];
extern  VTBL_ENTRY _ZTV7G26x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y1[];
Class_Descriptor cd_G26x6y1 = {  "G26x6y1", // class name
  bases_G26x6y1, 6,
  &(vtc_G26x6y1[0]), // expected_vtbl_contents
  &(vtt_G26x6y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y1),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y1),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y2  : E26x6 , virtual F1 {
  int ff;
  ~G26x6y2(); // tgen
  G26x6y2(); // tgen
};
//SIG(1 G26x6y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x6y2 ::~G26x6y2(){ note_dtor("G26x6y2", this);} // tgen
G26x6y2 ::G26x6y2(){ note_ctor("G26x6y2", this);} // tgen

static void Test_G26x6y2()
{
  extern Class_Descriptor cd_G26x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x6y2, buf);
    G26x6y2 *dp, &lv = *(dp=new (buf) G26x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y2)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(20,16), "G26x6y2");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(24,20), "G26x6y2");
    check_base_class_offset(lv, (C26*)(E26x6*), 0, "G26x6y2");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(28,24), "G26x6y2");
    check_base_class_offset(lv, (E26x6*), 0, "G26x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G26x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x6y2.ff");
    test_class_info(&lv, &cd_G26x6y2);
    dp->~G26x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y2(Test_G26x6y2, "G26x6y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x6y2C1Ev();
extern void _ZN7G26x6y2D1Ev();
Name_Map name_map_G26x6y2[] = {
  NSPAIR(_ZN7G26x6y2C1Ev),
  NSPAIR(_ZN7G26x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y2[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x6y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y2[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI7G26x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y2[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y2[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y2[] = {
  {&(_ZTV7G26x6y2[6]),  6,11},
  {&(_tg__ZTV5E26x6__7G26x6y2[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y2[4]),  4,5},
  {&(_ZTV7G26x6y2[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G26x6y2[];
extern  VTBL_ENTRY _ZTV7G26x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y2[];
Class_Descriptor cd_G26x6y2 = {  "G26x6y2", // class name
  bases_G26x6y2, 6,
  &(vtc_G26x6y2[0]), // expected_vtbl_contents
  &(vtt_G26x6y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y2),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y2),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y3  : virtual E26x6 , virtual F1 {
  int ff;
  ~G26x6y3(); // tgen
  G26x6y3(); // tgen
};
//SIG(1 G26x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x6y3 ::~G26x6y3(){ note_dtor("G26x6y3", this);} // tgen
G26x6y3 ::G26x6y3(){ note_ctor("G26x6y3", this);} // tgen

static void Test_G26x6y3()
{
  extern Class_Descriptor cd_G26x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x6y3, buf);
    G26x6y3 *dp, &lv = *(dp=new (buf) G26x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y3)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(32,20), "G26x6y3");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(36,24), "G26x6y3");
    check_base_class_offset(lv, (C26*)(E26x6*), ABISELECT(16,8), "G26x6y3");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(40,28), "G26x6y3");
    check_base_class_offset(lv, (E26x6*), ABISELECT(16,8), "G26x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G26x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x6y3.ff");
    test_class_info(&lv, &cd_G26x6y3);
    dp->~G26x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y3(Test_G26x6y3, "G26x6y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G26x6y3C1Ev();
extern void _ZN7G26x6y3D1Ev();
Name_Map name_map_G26x6y3[] = {
  NSPAIR(_ZN7G26x6y3C1Ev),
  NSPAIR(_ZN7G26x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y3[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x6y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y3[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x6y3[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G26x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y3[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y3[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y3[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y3[] = {
  {&(_ZTV7G26x6y3[7]),  7,18},
  {&(_ZTV7G26x6y3[13]),  13,18},
  {&(_ZTV7G26x6y3[17]),  17,18},
  {&(_tg__ZTV5E26x6__7G26x6y3[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y3[];
extern  VTBL_ENTRY _ZTV7G26x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y3[];
Class_Descriptor cd_G26x6y3 = {  "G26x6y3", // class name
  bases_G26x6y3, 6,
  &(vtc_G26x6y3[0]), // expected_vtbl_contents
  &(vtt_G26x6y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G26x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y3),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y3),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y4  : E26x6 , F0 {
  int ff;
  ~G26x6y4(); // tgen
  G26x6y4(); // tgen
};
//SIG(1 G26x6y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G26x6y4 ::~G26x6y4(){ note_dtor("G26x6y4", this);} // tgen
G26x6y4 ::G26x6y4(){ note_ctor("G26x6y4", this);} // tgen

static void Test_G26x6y4()
{
  extern Class_Descriptor cd_G26x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x6y4, buf);
    G26x6y4 *dp, &lv = *(dp=new (buf) G26x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y4)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(24,20), "G26x6y4");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(28,24), "G26x6y4");
    check_base_class_offset(lv, (C26*)(E26x6*), 0, "G26x6y4");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(32,28), "G26x6y4");
    check_base_class_offset(lv, (E26x6*), 0, "G26x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G26x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G26x6y4.ff");
    test_class_info(&lv, &cd_G26x6y4);
    dp->~G26x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y4(Test_G26x6y4, "G26x6y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G26x6y4C1Ev();
extern void _ZN7G26x6y4D1Ev();
Name_Map name_map_G26x6y4[] = {
  NSPAIR(_ZN7G26x6y4C1Ev),
  NSPAIR(_ZN7G26x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y4[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y4[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y4[] = {
  {&(_ZTV7G26x6y4[5]),  5,6},
  {&(_tg__ZTV5E26x6__7G26x6y4[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y4[];
extern  VTBL_ENTRY _ZTV7G26x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y4[];
Class_Descriptor cd_G26x6y4 = {  "G26x6y4", // class name
  bases_G26x6y4, 6,
  &(vtc_G26x6y4[0]), // expected_vtbl_contents
  &(vtt_G26x6y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G26x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y4),6, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y4),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y5  : virtual E26x6 , F0 {
  int ff;
  ~G26x6y5(); // tgen
  G26x6y5(); // tgen
};
//SIG(1 G26x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G26x6y5 ::~G26x6y5(){ note_dtor("G26x6y5", this);} // tgen
G26x6y5 ::G26x6y5(){ note_ctor("G26x6y5", this);} // tgen

static void Test_G26x6y5()
{
  extern Class_Descriptor cd_G26x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x6y5, buf);
    G26x6y5 *dp, &lv = *(dp=new (buf) G26x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y5)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(32,24), "G26x6y5");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(36,28), "G26x6y5");
    check_base_class_offset(lv, (C26*)(E26x6*), ABISELECT(16,12), "G26x6y5");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(40,32), "G26x6y5");
    check_base_class_offset(lv, (E26x6*), ABISELECT(16,12), "G26x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x6y5.ff");
    test_class_info(&lv, &cd_G26x6y5);
    dp->~G26x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y5(Test_G26x6y5, "G26x6y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x6y5C1Ev();
extern void _ZN7G26x6y5D1Ev();
Name_Map name_map_G26x6y5[] = {
  NSPAIR(_ZN7G26x6y5C1Ev),
  NSPAIR(_ZN7G26x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x6y5[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y5[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x6y5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y5[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y5[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y5[] = {
  {&(_ZTV7G26x6y5[6]),  6,13},
  {&(_ZTV7G26x6y5[12]),  12,13},
  {&(_tg__ZTV5E26x6__7G26x6y5[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y5[];
extern  VTBL_ENTRY _ZTV7G26x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y5[];
Class_Descriptor cd_G26x6y5 = {  "G26x6y5", // class name
  bases_G26x6y5, 6,
  &(vtc_G26x6y5[0]), // expected_vtbl_contents
  &(vtt_G26x6y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y5),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y5),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y6  : E26x6 , virtual F0 {
  int ff;
  ~G26x6y6(); // tgen
  G26x6y6(); // tgen
};
//SIG(1 G26x6y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x6y6 ::~G26x6y6(){ note_dtor("G26x6y6", this);} // tgen
G26x6y6 ::G26x6y6(){ note_ctor("G26x6y6", this);} // tgen

static void Test_G26x6y6()
{
  extern Class_Descriptor cd_G26x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G26x6y6, buf);
    G26x6y6 *dp, &lv = *(dp=new (buf) G26x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G26x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y6)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(20,16), "G26x6y6");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(24,20), "G26x6y6");
    check_base_class_offset(lv, (C26*)(E26x6*), 0, "G26x6y6");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(28,24), "G26x6y6");
    check_base_class_offset(lv, (E26x6*), 0, "G26x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G26x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x6y6.ff");
    test_class_info(&lv, &cd_G26x6y6);
    dp->~G26x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y6(Test_G26x6y6, "G26x6y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN7G26x6y6C1Ev();
extern void _ZN7G26x6y6D1Ev();
Name_Map name_map_G26x6y6[] = {
  NSPAIR(_ZN7G26x6y6C1Ev),
  NSPAIR(_ZN7G26x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x6y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y6[] = {
  ABISELECT(28,24),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y6[] = {
  {&(_ZTV7G26x6y6[6]),  6,7},
  {&(_tg__ZTV5E26x6__7G26x6y6[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y6[];
extern  VTBL_ENTRY _ZTV7G26x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y6[];
Class_Descriptor cd_G26x6y6 = {  "G26x6y6", // class name
  bases_G26x6y6, 6,
  &(vtc_G26x6y6[0]), // expected_vtbl_contents
  &(vtt_G26x6y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI7G26x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y6),7, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y6),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x6y7  : virtual E26x6 , virtual F0 {
  int ff;
  ~G26x6y7(); // tgen
  G26x6y7(); // tgen
};
//SIG(1 G26x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x6y7 ::~G26x6y7(){ note_dtor("G26x6y7", this);} // tgen
G26x6y7 ::G26x6y7(){ note_ctor("G26x6y7", this);} // tgen

static void Test_G26x6y7()
{
  extern Class_Descriptor cd_G26x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x6y7, buf);
    G26x6y7 *dp, &lv = *(dp=new (buf) G26x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x6y7)");
    check_base_class_offset(lv, (A0*)(C26*)(E26x6*), ABISELECT(32,20), "G26x6y7");
    check_base_class_offset(lv, (B0*)(C26*)(E26x6*), ABISELECT(36,24), "G26x6y7");
    check_base_class_offset(lv, (C26*)(E26x6*), ABISELECT(16,8), "G26x6y7");
    check_base_class_offset(lv, (D0*)(E26x6*), ABISELECT(40,28), "G26x6y7");
    check_base_class_offset(lv, (E26x6*), ABISELECT(16,8), "G26x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G26x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x6y7.ff");
    test_class_info(&lv, &cd_G26x6y7);
    dp->~G26x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x6y7(Test_G26x6y7, "G26x6y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x6y7C1Ev();
extern void _ZN7G26x6y7D1Ev();
Name_Map name_map_G26x6y7[] = {
  NSPAIR(_ZN7G26x6y7C1Ev),
  NSPAIR(_ZN7G26x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x6;
extern VTBL_ENTRY _ZTI5E26x6[];
extern  VTBL_ENTRY _ZTV5E26x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x6y7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x6y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x6y7[0]),
  0,
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x6y7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x6y7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV5E26x6__7G26x6y7[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C265E26x6__7G26x6y7[] = {
  ABISELECT(20,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x6y7[] = {
  {&(_ZTV7G26x6y7[7]),  7,14},
  {&(_ZTV7G26x6y7[13]),  13,14},
  {&(_tg__ZTV5E26x6__7G26x6y7[5]),  5,6},
  {&(_tg__ZTV3C265E26x6__7G26x6y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x6y7[];
extern  VTBL_ENTRY _ZTV7G26x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x6y7[];
Class_Descriptor cd_G26x6y7 = {  "G26x6y7", // class name
  bases_G26x6y7, 6,
  &(vtc_G26x6y7[0]), // expected_vtbl_contents
  &(vtt_G26x6y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x6y7),14, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x6y7),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E27x6  : C27 , virtual D0 {
  int fd;
  ~E27x6(); // tgen
  E27x6(); // tgen
};
//SIG(-1 E27x6) C1{ BC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E27x6 ::~E27x6(){ note_dtor("E27x6", this);} // tgen
E27x6 ::E27x6(){ note_ctor("E27x6", this);} // tgen

static void Test_E27x6()
{
  extern Class_Descriptor cd_E27x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E27x6, buf);
    E27x6 *dp, &lv = *(dp=new (buf) E27x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E27x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x6)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(16,12), "E27x6");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(28,20), "E27x6");
    check_base_class_offset(lv, (C27*), 0, "E27x6");
    check_base_class_offset(lv, (D0*), ABISELECT(32,24), "E27x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E27x6.fd");
    test_class_info(&lv, &cd_E27x6);
    dp->~E27x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x6(Test_E27x6, "E27x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E27x6C1Ev();
extern void _ZN5E27x6D1Ev();
Name_Map name_map_E27x6[] = {
  NSPAIR(_ZN5E27x6C1Ev),
  NSPAIR(_ZN5E27x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E27x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E27x6[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x6[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV5E27x6[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x6[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__5E27x6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x6[] = {
  {&(_ZTV5E27x6[5]),  5,10},
  {&(_tg__ZTV3C27__5E27x6[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__5E27x6[3]),  3,4},
  {&(_ZTV5E27x6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
static VTBL_ENTRY alt_thunk_names152[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x6 = {  "E27x6", // class name
  bases_E27x6, 4,
  &(vtc_E27x6[0]), // expected_vtbl_contents
  &(vtt_E27x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E27x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E27x6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E27x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names152,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y0  : E27x6 , F1 {
  int ff;
  ~G27x6y0(); // tgen
  G27x6y0(); // tgen
};
//SIG(1 G27x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x6y0 ::~G27x6y0(){ note_dtor("G27x6y0", this);} // tgen
G27x6y0 ::G27x6y0(){ note_ctor("G27x6y0", this);} // tgen

static void Test_G27x6y0()
{
  extern Class_Descriptor cd_G27x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x6y0, buf);
    G27x6y0 *dp, &lv = *(dp=new (buf) G27x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y0)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(32,24), "G27x6y0");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(44,32), "G27x6y0");
    check_base_class_offset(lv, (C27*)(E27x6*), 0, "G27x6y0");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(48,36), "G27x6y0");
    check_base_class_offset(lv, (E27x6*), 0, "G27x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G27x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G27x6y0.ff");
    test_class_info(&lv, &cd_G27x6y0);
    dp->~G27x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y0(Test_G27x6y0, "G27x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x6y0C1Ev();
extern void _ZN7G27x6y0D1Ev();
Name_Map name_map_G27x6y0[] = {
  NSPAIR(_ZN7G27x6y0C1Ev),
  NSPAIR(_ZN7G27x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y0[];
extern void _ZN3C273fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x6y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y0[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x6y0[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y0[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y0[] = {
  {&(_ZTV7G27x6y0[5]),  5,13},
  {&(_tg__ZTV5E27x6__7G27x6y0[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y0[3]),  3,4},
  {&(_ZTV7G27x6y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G27x6y0[];
extern  VTBL_ENTRY _ZTV7G27x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y0[];
static VTBL_ENTRY alt_thunk_names153[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C273fooEv,_ZThn24_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y0 = {  "G27x6y0", // class name
  bases_G27x6y0, 6,
  &(vtc_G27x6y0[0]), // expected_vtbl_contents
  &(vtt_G27x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names153,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y1  : virtual E27x6 , F1 {
  int ff;
  ~G27x6y1(); // tgen
  G27x6y1(); // tgen
};
//SIG(1 G27x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x6y1 ::~G27x6y1(){ note_dtor("G27x6y1", this);} // tgen
G27x6y1 ::G27x6y1(){ note_ctor("G27x6y1", this);} // tgen

static void Test_G27x6y1()
{
  extern Class_Descriptor cd_G27x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x6y1, buf);
    G27x6y1 *dp, &lv = *(dp=new (buf) G27x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y1)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(32,24), "G27x6y1");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(44,32), "G27x6y1");
    check_base_class_offset(lv, (C27*)(E27x6*), ABISELECT(16,12), "G27x6y1");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(48,36), "G27x6y1");
    check_base_class_offset(lv, (E27x6*), ABISELECT(16,12), "G27x6y1");
    check_base_class_offset(lv, (F1*), 0, "G27x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x6y1.ff");
    test_class_info(&lv, &cd_G27x6y1);
    dp->~G27x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y1(Test_G27x6y1, "G27x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x6y1C1Ev();
extern void _ZN7G27x6y1D1Ev();
Name_Map name_map_G27x6y1[] = {
  NSPAIR(_ZN7G27x6y1C1Ev),
  NSPAIR(_ZN7G27x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x6y1[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x6y1[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x6y1[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y1[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y1[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y1[] = {
  {&(_ZTV7G27x6y1[6]),  6,18},
  {&(_ZTV7G27x6y1[13]),  13,18},
  {&(_ZTV7G27x6y1[17]),  17,18},
  {&(_tg__ZTV5E27x6__7G27x6y1[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x6y1[];
extern  VTBL_ENTRY _ZTV7G27x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y1[];
static VTBL_ENTRY alt_thunk_names154[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y1 = {  "G27x6y1", // class name
  bases_G27x6y1, 6,
  &(vtc_G27x6y1[0]), // expected_vtbl_contents
  &(vtt_G27x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names154,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y2  : E27x6 , virtual F1 {
  int ff;
  ~G27x6y2(); // tgen
  G27x6y2(); // tgen
};
//SIG(1 G27x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x6y2 ::~G27x6y2(){ note_dtor("G27x6y2", this);} // tgen
G27x6y2 ::G27x6y2(){ note_ctor("G27x6y2", this);} // tgen

static void Test_G27x6y2()
{
  extern Class_Descriptor cd_G27x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x6y2, buf);
    G27x6y2 *dp, &lv = *(dp=new (buf) G27x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y2)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(24,16), "G27x6y2");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(36,24), "G27x6y2");
    check_base_class_offset(lv, (C27*)(E27x6*), 0, "G27x6y2");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(40,28), "G27x6y2");
    check_base_class_offset(lv, (E27x6*), 0, "G27x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G27x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x6y2.ff");
    test_class_info(&lv, &cd_G27x6y2);
    dp->~G27x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y2(Test_G27x6y2, "G27x6y2", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G27x6y2C1Ev();
extern void _ZN7G27x6y2D1Ev();
Name_Map name_map_G27x6y2[] = {
  NSPAIR(_ZN7G27x6y2C1Ev),
  NSPAIR(_ZN7G27x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y2[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x6y2[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y2[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G27x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G27x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x6y2[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y2[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y2[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y2[] = {
  {&(_ZTV7G27x6y2[6]),  6,15},
  {&(_tg__ZTV5E27x6__7G27x6y2[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y2[3]),  3,4},
  {&(_ZTV7G27x6y2[10]),  10,15},
  {&(_ZTV7G27x6y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G27x6y2[];
extern  VTBL_ENTRY _ZTV7G27x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y2[];
static VTBL_ENTRY alt_thunk_names155[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y2 = {  "G27x6y2", // class name
  bases_G27x6y2, 6,
  &(vtc_G27x6y2[0]), // expected_vtbl_contents
  &(vtt_G27x6y2[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G27x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names155,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y3  : virtual E27x6 , virtual F1 {
  int ff;
  ~G27x6y3(); // tgen
  G27x6y3(); // tgen
};
//SIG(1 G27x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x6y3 ::~G27x6y3(){ note_dtor("G27x6y3", this);} // tgen
G27x6y3 ::G27x6y3(){ note_ctor("G27x6y3", this);} // tgen

static void Test_G27x6y3()
{
  extern Class_Descriptor cd_G27x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x6y3, buf);
    G27x6y3 *dp, &lv = *(dp=new (buf) G27x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y3)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(32,20), "G27x6y3");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(44,28), "G27x6y3");
    check_base_class_offset(lv, (C27*)(E27x6*), ABISELECT(16,8), "G27x6y3");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(48,32), "G27x6y3");
    check_base_class_offset(lv, (E27x6*), ABISELECT(16,8), "G27x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x6y3.ff");
    test_class_info(&lv, &cd_G27x6y3);
    dp->~G27x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y3(Test_G27x6y3, "G27x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x6y3C1Ev();
extern void _ZN7G27x6y3D1Ev();
Name_Map name_map_G27x6y3[] = {
  NSPAIR(_ZN7G27x6y3C1Ev),
  NSPAIR(_ZN7G27x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y3[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y3[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x6y3[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G27x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x6y3[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y3[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y3[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y3[] = {
  {&(_ZTV7G27x6y3[7]),  7,22},
  {&(_ZTV7G27x6y3[13]),  13,22},
  {&(_ZTV7G27x6y3[17]),  17,22},
  {&(_ZTV7G27x6y3[21]),  21,22},
  {&(_tg__ZTV5E27x6__7G27x6y3[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x6y3[];
extern  VTBL_ENTRY _ZTV7G27x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y3[];
static VTBL_ENTRY alt_thunk_names156[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y3 = {  "G27x6y3", // class name
  bases_G27x6y3, 6,
  &(vtc_G27x6y3[0]), // expected_vtbl_contents
  &(vtt_G27x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names156,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y4  : E27x6 , F0 {
  int ff;
  ~G27x6y4(); // tgen
  G27x6y4(); // tgen
};
//SIG(1 G27x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G27x6y4 ::~G27x6y4(){ note_dtor("G27x6y4", this);} // tgen
G27x6y4 ::G27x6y4(){ note_ctor("G27x6y4", this);} // tgen

static void Test_G27x6y4()
{
  extern Class_Descriptor cd_G27x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x6y4, buf);
    G27x6y4 *dp, &lv = *(dp=new (buf) G27x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y4)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(24,20), "G27x6y4");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(36,28), "G27x6y4");
    check_base_class_offset(lv, (C27*)(E27x6*), 0, "G27x6y4");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(40,32), "G27x6y4");
    check_base_class_offset(lv, (E27x6*), 0, "G27x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G27x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G27x6y4.ff");
    test_class_info(&lv, &cd_G27x6y4);
    dp->~G27x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y4(Test_G27x6y4, "G27x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G27x6y4C1Ev();
extern void _ZN7G27x6y4D1Ev();
Name_Map name_map_G27x6y4[] = {
  NSPAIR(_ZN7G27x6y4C1Ev),
  NSPAIR(_ZN7G27x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y4[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x6y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G27x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x6y4[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y4[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y4[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y4[] = {
  {&(_ZTV7G27x6y4[5]),  5,10},
  {&(_tg__ZTV5E27x6__7G27x6y4[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y4[3]),  3,4},
  {&(_ZTV7G27x6y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G27x6y4[];
extern  VTBL_ENTRY _ZTV7G27x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y4[];
static VTBL_ENTRY alt_thunk_names157[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn20_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y4 = {  "G27x6y4", // class name
  bases_G27x6y4, 6,
  &(vtc_G27x6y4[0]), // expected_vtbl_contents
  &(vtt_G27x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G27x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names157,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y5  : virtual E27x6 , F0 {
  int ff;
  ~G27x6y5(); // tgen
  G27x6y5(); // tgen
};
//SIG(1 G27x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G27x6y5 ::~G27x6y5(){ note_dtor("G27x6y5", this);} // tgen
G27x6y5 ::G27x6y5(){ note_ctor("G27x6y5", this);} // tgen

static void Test_G27x6y5()
{
  extern Class_Descriptor cd_G27x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x6y5, buf);
    G27x6y5 *dp, &lv = *(dp=new (buf) G27x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y5)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(32,24), "G27x6y5");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(44,32), "G27x6y5");
    check_base_class_offset(lv, (C27*)(E27x6*), ABISELECT(16,12), "G27x6y5");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(48,36), "G27x6y5");
    check_base_class_offset(lv, (E27x6*), ABISELECT(16,12), "G27x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x6y5.ff");
    test_class_info(&lv, &cd_G27x6y5);
    dp->~G27x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y5(Test_G27x6y5, "G27x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x6y5C1Ev();
extern void _ZN7G27x6y5D1Ev();
Name_Map name_map_G27x6y5[] = {
  NSPAIR(_ZN7G27x6y5C1Ev),
  NSPAIR(_ZN7G27x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y5[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x6y5[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y5[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x6y5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G27x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x6y5[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y5[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y5[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y5[] = {
  {&(_ZTV7G27x6y5[6]),  6,17},
  {&(_ZTV7G27x6y5[12]),  12,17},
  {&(_ZTV7G27x6y5[16]),  16,17},
  {&(_tg__ZTV5E27x6__7G27x6y5[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x6y5[];
extern  VTBL_ENTRY _ZTV7G27x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y5[];
static VTBL_ENTRY alt_thunk_names158[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y5 = {  "G27x6y5", // class name
  bases_G27x6y5, 6,
  &(vtc_G27x6y5[0]), // expected_vtbl_contents
  &(vtt_G27x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names158,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y6  : E27x6 , virtual F0 {
  int ff;
  ~G27x6y6(); // tgen
  G27x6y6(); // tgen
};
//SIG(1 G27x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x6y6 ::~G27x6y6(){ note_dtor("G27x6y6", this);} // tgen
G27x6y6 ::G27x6y6(){ note_ctor("G27x6y6", this);} // tgen

static void Test_G27x6y6()
{
  extern Class_Descriptor cd_G27x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G27x6y6, buf);
    G27x6y6 *dp, &lv = *(dp=new (buf) G27x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G27x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y6)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(24,16), "G27x6y6");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(36,24), "G27x6y6");
    check_base_class_offset(lv, (C27*)(E27x6*), 0, "G27x6y6");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(40,28), "G27x6y6");
    check_base_class_offset(lv, (E27x6*), 0, "G27x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G27x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x6y6.ff");
    test_class_info(&lv, &cd_G27x6y6);
    dp->~G27x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y6(Test_G27x6y6, "G27x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G27x6y6C1Ev();
extern void _ZN7G27x6y6D1Ev();
Name_Map name_map_G27x6y6[] = {
  NSPAIR(_ZN7G27x6y6C1Ev),
  NSPAIR(_ZN7G27x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y6[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x6y6[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G27x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x6y6[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y6[] = {
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y6[] = {
  {&(_ZTV7G27x6y6[6]),  6,11},
  {&(_tg__ZTV5E27x6__7G27x6y6[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y6[3]),  3,4},
  {&(_ZTV7G27x6y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G27x6y6[];
extern  VTBL_ENTRY _ZTV7G27x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y6[];
static VTBL_ENTRY alt_thunk_names159[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C273fooEv,_ZThn16_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y6 = {  "G27x6y6", // class name
  bases_G27x6y6, 6,
  &(vtc_G27x6y6[0]), // expected_vtbl_contents
  &(vtt_G27x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G27x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names159,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x6y7  : virtual E27x6 , virtual F0 {
  int ff;
  ~G27x6y7(); // tgen
  G27x6y7(); // tgen
};
//SIG(1 G27x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x6y7 ::~G27x6y7(){ note_dtor("G27x6y7", this);} // tgen
G27x6y7 ::G27x6y7(){ note_ctor("G27x6y7", this);} // tgen

static void Test_G27x6y7()
{
  extern Class_Descriptor cd_G27x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x6y7, buf);
    G27x6y7 *dp, &lv = *(dp=new (buf) G27x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x6y7)");
    check_base_class_offset(lv, (A1*)(C27*)(E27x6*), ABISELECT(32,20), "G27x6y7");
    check_base_class_offset(lv, (B0*)(C27*)(E27x6*), ABISELECT(44,28), "G27x6y7");
    check_base_class_offset(lv, (C27*)(E27x6*), ABISELECT(16,8), "G27x6y7");
    check_base_class_offset(lv, (D0*)(E27x6*), ABISELECT(48,32), "G27x6y7");
    check_base_class_offset(lv, (E27x6*), ABISELECT(16,8), "G27x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G27x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x6y7.ff");
    test_class_info(&lv, &cd_G27x6y7);
    dp->~G27x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x6y7(Test_G27x6y7, "G27x6y7", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x6y7C1Ev();
extern void _ZN7G27x6y7D1Ev();
Name_Map name_map_G27x6y7[] = {
  NSPAIR(_ZN7G27x6y7C1Ev),
  NSPAIR(_ZN7G27x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x6;
extern VTBL_ENTRY _ZTI5E27x6[];
extern  VTBL_ENTRY _ZTV5E27x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x6y7[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x6y7[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x6y7[0]),
  0,
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x6y7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x6y7[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV5E27x6__7G27x6y7[] = {
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C275E27x6__7G27x6y7[] = {
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C275E27x6__7G27x6y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x6__7G27x6y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x6y7[] = {
  {&(_ZTV7G27x6y7[7]),  7,18},
  {&(_ZTV7G27x6y7[13]),  13,18},
  {&(_ZTV7G27x6y7[17]),  17,18},
  {&(_tg__ZTV5E27x6__7G27x6y7[5]),  5,6},
  {&(_tg__ZTV3C275E27x6__7G27x6y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C275E27x6__7G27x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E27x6__7G27x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x6y7[];
extern  VTBL_ENTRY _ZTV7G27x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x6y7[];
static VTBL_ENTRY alt_thunk_names160[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn12_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x6y7 = {  "G27x6y7", // class name
  bases_G27x6y7, 6,
  &(vtc_G27x6y7[0]), // expected_vtbl_contents
  &(vtt_G27x6y7[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x6y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names160,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x6  : C28 , virtual D0 {
  int fd;
  ~E28x6(); // tgen
  E28x6(); // tgen
};
//SIG(-1 E28x6) C1{ BC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E28x6 ::~E28x6(){ note_dtor("E28x6", this);} // tgen
E28x6 ::E28x6(){ note_ctor("E28x6", this);} // tgen

static void Test_E28x6()
{
  extern Class_Descriptor cd_E28x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E28x6, buf);
    E28x6 *dp, &lv = *(dp=new (buf) E28x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E28x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x6)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(8,4), "E28x6");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(24,16), "E28x6");
    check_base_class_offset(lv, (C28*), 0, "E28x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E28x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E28x6.fd");
    test_class_info(&lv, &cd_E28x6);
    dp->~E28x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x6(Test_E28x6, "E28x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E28x6C1Ev();
extern void _ZN5E28x6D1Ev();
Name_Map name_map_E28x6[] = {
  NSPAIR(_ZN5E28x6C1Ev),
  NSPAIR(_ZN5E28x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E28x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E28x6[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV5E28x6[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__5E28x6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x6[] = {
  {&(_ZTV5E28x6[4]),  4,9},
  {&(_tg__ZTV3C28__5E28x6[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__5E28x6[3]),  3,4},
  {&(_ZTV5E28x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
static VTBL_ENTRY alt_thunk_names161[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x6 = {  "E28x6", // class name
  bases_E28x6, 4,
  &(vtc_E28x6[0]), // expected_vtbl_contents
  &(vtt_E28x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E28x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E28x6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E28x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names161,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y0  : E28x6 , F1 {
  int ff;
  ~G28x6y0(); // tgen
  G28x6y0(); // tgen
};
//SIG(1 G28x6y0) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x6y0 ::~G28x6y0(){ note_dtor("G28x6y0", this);} // tgen
G28x6y0 ::G28x6y0(){ note_ctor("G28x6y0", this);} // tgen

static void Test_G28x6y0()
{
  extern Class_Descriptor cd_G28x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x6y0, buf);
    G28x6y0 *dp, &lv = *(dp=new (buf) G28x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y0)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(8,4), "G28x6y0");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(40,28), "G28x6y0");
    check_base_class_offset(lv, (C28*)(E28x6*), 0, "G28x6y0");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(52,36), "G28x6y0");
    check_base_class_offset(lv, (E28x6*), 0, "G28x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G28x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G28x6y0.ff");
    test_class_info(&lv, &cd_G28x6y0);
    dp->~G28x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y0(Test_G28x6y0, "G28x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x6y0C1Ev();
extern void _ZN7G28x6y0D1Ev();
Name_Map name_map_G28x6y0[] = {
  NSPAIR(_ZN7G28x6y0C1Ev),
  NSPAIR(_ZN7G28x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y0[];
extern void _ZN3C283fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y0[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G28x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x6y0[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y0[] = {
  {&(_ZTV7G28x6y0[4]),  4,12},
  {&(_tg__ZTV5E28x6__7G28x6y0[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y0[3]),  3,4},
  {&(_ZTV7G28x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G28x6y0[];
extern  VTBL_ENTRY _ZTV7G28x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y0[];
static VTBL_ENTRY alt_thunk_names162[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C283fooEv,_ZThn28_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y0 = {  "G28x6y0", // class name
  bases_G28x6y0, 6,
  &(vtc_G28x6y0[0]), // expected_vtbl_contents
  &(vtt_G28x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names162,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y1  : virtual E28x6 , F1 {
  int ff;
  ~G28x6y1(); // tgen
  G28x6y1(); // tgen
};
//SIG(1 G28x6y1) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x6y1 ::~G28x6y1(){ note_dtor("G28x6y1", this);} // tgen
G28x6y1 ::G28x6y1(){ note_ctor("G28x6y1", this);} // tgen

static void Test_G28x6y1()
{
  extern Class_Descriptor cd_G28x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x6y1, buf);
    G28x6y1 *dp, &lv = *(dp=new (buf) G28x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y1)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(24,16), "G28x6y1");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(40,28), "G28x6y1");
    check_base_class_offset(lv, (C28*)(E28x6*), ABISELECT(16,12), "G28x6y1");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(52,36), "G28x6y1");
    check_base_class_offset(lv, (E28x6*), ABISELECT(16,12), "G28x6y1");
    check_base_class_offset(lv, (F1*), 0, "G28x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x6y1.ff");
    test_class_info(&lv, &cd_G28x6y1);
    dp->~G28x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y1(Test_G28x6y1, "G28x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x6y1C1Ev();
extern void _ZN7G28x6y1D1Ev();
Name_Map name_map_G28x6y1[] = {
  NSPAIR(_ZN7G28x6y1C1Ev),
  NSPAIR(_ZN7G28x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x6y1[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x6y1[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y1[] = {
  {&(_ZTV7G28x6y1[5]),  5,16},
  {&(_ZTV7G28x6y1[11]),  11,16},
  {&(_ZTV7G28x6y1[15]),  15,16},
  {&(_tg__ZTV5E28x6__7G28x6y1[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x6y1[];
extern  VTBL_ENTRY _ZTV7G28x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y1[];
static VTBL_ENTRY alt_thunk_names163[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y1 = {  "G28x6y1", // class name
  bases_G28x6y1, 6,
  &(vtc_G28x6y1[0]), // expected_vtbl_contents
  &(vtt_G28x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names163,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y2  : E28x6 , virtual F1 {
  int ff;
  ~G28x6y2(); // tgen
  G28x6y2(); // tgen
};
//SIG(1 G28x6y2) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x6y2 ::~G28x6y2(){ note_dtor("G28x6y2", this);} // tgen
G28x6y2 ::G28x6y2(){ note_ctor("G28x6y2", this);} // tgen

static void Test_G28x6y2()
{
  extern Class_Descriptor cd_G28x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x6y2, buf);
    G28x6y2 *dp, &lv = *(dp=new (buf) G28x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y2)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(8,4), "G28x6y2");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(24,20), "G28x6y2");
    check_base_class_offset(lv, (C28*)(E28x6*), 0, "G28x6y2");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(36,28), "G28x6y2");
    check_base_class_offset(lv, (E28x6*), 0, "G28x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G28x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G28x6y2.ff");
    test_class_info(&lv, &cd_G28x6y2);
    dp->~G28x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y2(Test_G28x6y2, "G28x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x6y2C1Ev();
extern void _ZN7G28x6y2D1Ev();
Name_Map name_map_G28x6y2[] = {
  NSPAIR(_ZN7G28x6y2C1Ev),
  NSPAIR(_ZN7G28x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y2[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y2[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G28x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G28x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x6y2[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y2[] = {
  {&(_ZTV7G28x6y2[5]),  5,14},
  {&(_tg__ZTV5E28x6__7G28x6y2[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y2[3]),  3,4},
  {&(_ZTV7G28x6y2[9]),  9,14},
  {&(_ZTV7G28x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G28x6y2[];
extern  VTBL_ENTRY _ZTV7G28x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y2[];
static VTBL_ENTRY alt_thunk_names164[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y2 = {  "G28x6y2", // class name
  bases_G28x6y2, 6,
  &(vtc_G28x6y2[0]), // expected_vtbl_contents
  &(vtt_G28x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names164,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y3  : virtual E28x6 , virtual F1 {
  int ff;
  ~G28x6y3(); // tgen
  G28x6y3(); // tgen
};
//SIG(1 G28x6y3) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x6y3 ::~G28x6y3(){ note_dtor("G28x6y3", this);} // tgen
G28x6y3 ::G28x6y3(){ note_ctor("G28x6y3", this);} // tgen

static void Test_G28x6y3()
{
  extern Class_Descriptor cd_G28x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x6y3, buf);
    G28x6y3 *dp, &lv = *(dp=new (buf) G28x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y3)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(24,12), "G28x6y3");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(40,24), "G28x6y3");
    check_base_class_offset(lv, (C28*)(E28x6*), ABISELECT(16,8), "G28x6y3");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(52,32), "G28x6y3");
    check_base_class_offset(lv, (E28x6*), ABISELECT(16,8), "G28x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G28x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x6y3.ff");
    test_class_info(&lv, &cd_G28x6y3);
    dp->~G28x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y3(Test_G28x6y3, "G28x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G28x6y3C1Ev();
extern void _ZN7G28x6y3D1Ev();
Name_Map name_map_G28x6y3[] = {
  NSPAIR(_ZN7G28x6y3C1Ev),
  NSPAIR(_ZN7G28x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y3[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x6y3[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G28x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G28x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x6y3[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y3[] = {
  {&(_ZTV7G28x6y3[6]),  6,20},
  {&(_ZTV7G28x6y3[11]),  11,20},
  {&(_ZTV7G28x6y3[15]),  15,20},
  {&(_ZTV7G28x6y3[19]),  19,20},
  {&(_tg__ZTV5E28x6__7G28x6y3[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x6y3[];
extern  VTBL_ENTRY _ZTV7G28x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y3[];
static VTBL_ENTRY alt_thunk_names165[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y3 = {  "G28x6y3", // class name
  bases_G28x6y3, 6,
  &(vtc_G28x6y3[0]), // expected_vtbl_contents
  &(vtt_G28x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G28x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names165,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y4  : E28x6 , F0 {
  int ff;
  ~G28x6y4(); // tgen
  G28x6y4(); // tgen
};
//SIG(1 G28x6y4) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G28x6y4 ::~G28x6y4(){ note_dtor("G28x6y4", this);} // tgen
G28x6y4 ::G28x6y4(){ note_ctor("G28x6y4", this);} // tgen

static void Test_G28x6y4()
{
  extern Class_Descriptor cd_G28x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x6y4, buf);
    G28x6y4 *dp, &lv = *(dp=new (buf) G28x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y4)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(8,4), "G28x6y4");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(32,24), "G28x6y4");
    check_base_class_offset(lv, (C28*)(E28x6*), 0, "G28x6y4");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(44,32), "G28x6y4");
    check_base_class_offset(lv, (E28x6*), 0, "G28x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G28x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G28x6y4.ff");
    test_class_info(&lv, &cd_G28x6y4);
    dp->~G28x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y4(Test_G28x6y4, "G28x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G28x6y4C1Ev();
extern void _ZN7G28x6y4D1Ev();
Name_Map name_map_G28x6y4[] = {
  NSPAIR(_ZN7G28x6y4C1Ev),
  NSPAIR(_ZN7G28x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y4[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x6y4[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y4[] = {
  {&(_ZTV7G28x6y4[4]),  4,9},
  {&(_tg__ZTV5E28x6__7G28x6y4[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y4[3]),  3,4},
  {&(_ZTV7G28x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G28x6y4[];
extern  VTBL_ENTRY _ZTV7G28x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y4[];
static VTBL_ENTRY alt_thunk_names166[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C283fooEv,_ZThn24_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y4 = {  "G28x6y4", // class name
  bases_G28x6y4, 6,
  &(vtc_G28x6y4[0]), // expected_vtbl_contents
  &(vtt_G28x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G28x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names166,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y5  : virtual E28x6 , F0 {
  int ff;
  ~G28x6y5(); // tgen
  G28x6y5(); // tgen
};
//SIG(1 G28x6y5) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G28x6y5 ::~G28x6y5(){ note_dtor("G28x6y5", this);} // tgen
G28x6y5 ::G28x6y5(){ note_ctor("G28x6y5", this);} // tgen

static void Test_G28x6y5()
{
  extern Class_Descriptor cd_G28x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x6y5, buf);
    G28x6y5 *dp, &lv = *(dp=new (buf) G28x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y5)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(24,16), "G28x6y5");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(40,28), "G28x6y5");
    check_base_class_offset(lv, (C28*)(E28x6*), ABISELECT(16,12), "G28x6y5");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(52,36), "G28x6y5");
    check_base_class_offset(lv, (E28x6*), ABISELECT(16,12), "G28x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x6y5.ff");
    test_class_info(&lv, &cd_G28x6y5);
    dp->~G28x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y5(Test_G28x6y5, "G28x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x6y5C1Ev();
extern void _ZN7G28x6y5D1Ev();
Name_Map name_map_G28x6y5[] = {
  NSPAIR(_ZN7G28x6y5C1Ev),
  NSPAIR(_ZN7G28x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y5[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x6y5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x6y5[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y5[] = {
  {&(_ZTV7G28x6y5[5]),  5,15},
  {&(_ZTV7G28x6y5[10]),  10,15},
  {&(_ZTV7G28x6y5[14]),  14,15},
  {&(_tg__ZTV5E28x6__7G28x6y5[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x6y5[];
extern  VTBL_ENTRY _ZTV7G28x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y5[];
static VTBL_ENTRY alt_thunk_names167[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y5 = {  "G28x6y5", // class name
  bases_G28x6y5, 6,
  &(vtc_G28x6y5[0]), // expected_vtbl_contents
  &(vtt_G28x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names167,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y6  : E28x6 , virtual F0 {
  int ff;
  ~G28x6y6(); // tgen
  G28x6y6(); // tgen
};
//SIG(1 G28x6y6) C1{ BC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x6y6 ::~G28x6y6(){ note_dtor("G28x6y6", this);} // tgen
G28x6y6 ::G28x6y6(){ note_ctor("G28x6y6", this);} // tgen

static void Test_G28x6y6()
{
  extern Class_Descriptor cd_G28x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G28x6y6, buf);
    G28x6y6 *dp, &lv = *(dp=new (buf) G28x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G28x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y6)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(8,4), "G28x6y6");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(24,20), "G28x6y6");
    check_base_class_offset(lv, (C28*)(E28x6*), 0, "G28x6y6");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(36,28), "G28x6y6");
    check_base_class_offset(lv, (E28x6*), 0, "G28x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G28x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G28x6y6.ff");
    test_class_info(&lv, &cd_G28x6y6);
    dp->~G28x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y6(Test_G28x6y6, "G28x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G28x6y6C1Ev();
extern void _ZN7G28x6y6D1Ev();
Name_Map name_map_G28x6y6[] = {
  NSPAIR(_ZN7G28x6y6C1Ev),
  NSPAIR(_ZN7G28x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y6[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G28x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x6y6[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y6[] = {
  {&(_ZTV7G28x6y6[5]),  5,10},
  {&(_tg__ZTV5E28x6__7G28x6y6[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y6[3]),  3,4},
  {&(_ZTV7G28x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G28x6y6[];
extern  VTBL_ENTRY _ZTV7G28x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y6[];
static VTBL_ENTRY alt_thunk_names168[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn20_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y6 = {  "G28x6y6", // class name
  bases_G28x6y6, 6,
  &(vtc_G28x6y6[0]), // expected_vtbl_contents
  &(vtt_G28x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G28x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names168,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x6y7  : virtual E28x6 , virtual F0 {
  int ff;
  ~G28x6y7(); // tgen
  G28x6y7(); // tgen
};
//SIG(1 G28x6y7) C1{ VBC2{ BC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x6y7 ::~G28x6y7(){ note_dtor("G28x6y7", this);} // tgen
G28x6y7 ::G28x6y7(){ note_ctor("G28x6y7", this);} // tgen

static void Test_G28x6y7()
{
  extern Class_Descriptor cd_G28x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G28x6y7, buf);
    G28x6y7 *dp, &lv = *(dp=new (buf) G28x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G28x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x6y7)");
    check_base_class_offset(lv, (A0*)(C28*)(E28x6*), ABISELECT(24,12), "G28x6y7");
    check_base_class_offset(lv, (B1*)(C28*)(E28x6*), ABISELECT(40,24), "G28x6y7");
    check_base_class_offset(lv, (C28*)(E28x6*), ABISELECT(16,8), "G28x6y7");
    check_base_class_offset(lv, (D0*)(E28x6*), ABISELECT(52,32), "G28x6y7");
    check_base_class_offset(lv, (E28x6*), ABISELECT(16,8), "G28x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G28x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x6y7.ff");
    test_class_info(&lv, &cd_G28x6y7);
    dp->~G28x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x6y7(Test_G28x6y7, "G28x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G28x6y7C1Ev();
extern void _ZN7G28x6y7D1Ev();
Name_Map name_map_G28x6y7[] = {
  NSPAIR(_ZN7G28x6y7C1Ev),
  NSPAIR(_ZN7G28x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x6;
extern VTBL_ENTRY _ZTI5E28x6[];
extern  VTBL_ENTRY _ZTV5E28x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x6y7[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x6y7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G28x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x6y7[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV5E28x6__7G28x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C285E28x6__7G28x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C285E28x6__7G28x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x6__7G28x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x6y7[] = {
  {&(_ZTV7G28x6y7[6]),  6,16},
  {&(_ZTV7G28x6y7[11]),  11,16},
  {&(_ZTV7G28x6y7[15]),  15,16},
  {&(_tg__ZTV5E28x6__7G28x6y7[4]),  4,5},
  {&(_tg__ZTV3C285E28x6__7G28x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C285E28x6__7G28x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E28x6__7G28x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x6y7[];
extern  VTBL_ENTRY _ZTV7G28x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x6y7[];
static VTBL_ENTRY alt_thunk_names169[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C283fooEv,_ZThn16_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x6y7 = {  "G28x6y7", // class name
  bases_G28x6y7, 6,
  &(vtc_G28x6y7[0]), // expected_vtbl_contents
  &(vtt_G28x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G28x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x6y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names169,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x6  : C29 , virtual D0 {
  int fd;
  ~E29x6(); // tgen
  E29x6(); // tgen
};
//SIG(-1 E29x6) C1{ BC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E29x6 ::~E29x6(){ note_dtor("E29x6", this);} // tgen
E29x6 ::E29x6(){ note_ctor("E29x6", this);} // tgen

static void Test_E29x6()
{
  extern Class_Descriptor cd_E29x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E29x6, buf);
    E29x6 *dp, &lv = *(dp=new (buf) E29x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E29x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x6)");
    check_base_class_offset(lv, (A1*)(C29*), 0, "E29x6");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(24,16), "E29x6");
    check_base_class_offset(lv, (C29*), 0, "E29x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E29x6");
    check_field_offset(lv, fd, ABISELECT(16,12), "E29x6.fd");
    test_class_info(&lv, &cd_E29x6);
    dp->~E29x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x6(Test_E29x6, "E29x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E29x6C1Ev();
extern void _ZN5E29x6D1Ev();
Name_Map name_map_E29x6[] = {
  NSPAIR(_ZN5E29x6C1Ev),
  NSPAIR(_ZN5E29x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E29x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E29x6[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV5E29x6[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x6[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__5E29x6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x6[] = {
  {&(_ZTV5E29x6[4]),  4,9},
  {&(_tg__ZTV3C29__5E29x6[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__5E29x6[3]),  3,4},
  {&(_ZTV5E29x6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
static VTBL_ENTRY alt_thunk_names170[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x6 = {  "E29x6", // class name
  bases_E29x6, 4,
  &(vtc_E29x6[0]), // expected_vtbl_contents
  &(vtt_E29x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E29x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E29x6),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E29x6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names170,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y0  : E29x6 , F1 {
  int ff;
  ~G29x6y0(); // tgen
  G29x6y0(); // tgen
};
//SIG(1 G29x6y0) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x6y0 ::~G29x6y0(){ note_dtor("G29x6y0", this);} // tgen
G29x6y0 ::G29x6y0(){ note_ctor("G29x6y0", this);} // tgen

static void Test_G29x6y0()
{
  extern Class_Descriptor cd_G29x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x6y0, buf);
    G29x6y0 *dp, &lv = *(dp=new (buf) G29x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y0)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), 0, "G29x6y0");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(40,28), "G29x6y0");
    check_base_class_offset(lv, (C29*)(E29x6*), 0, "G29x6y0");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(52,36), "G29x6y0");
    check_base_class_offset(lv, (E29x6*), 0, "G29x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(24,16), "G29x6y0");
    check_field_offset(lv, ff, ABISELECT(36,24), "G29x6y0.ff");
    test_class_info(&lv, &cd_G29x6y0);
    dp->~G29x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y0(Test_G29x6y0, "G29x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x6y0C1Ev();
extern void _ZN7G29x6y0D1Ev();
Name_Map name_map_G29x6y0[] = {
  NSPAIR(_ZN7G29x6y0C1Ev),
  NSPAIR(_ZN7G29x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y0[];
extern void _ZN3C293fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y0[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G29x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x6y0[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y0[] = {
  ABISELECT(40,28),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y0[] = {
  {&(_ZTV7G29x6y0[4]),  4,12},
  {&(_tg__ZTV5E29x6__7G29x6y0[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y0[3]),  3,4},
  {&(_ZTV7G29x6y0[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G29x6y0[];
extern  VTBL_ENTRY _ZTV7G29x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y0[];
static VTBL_ENTRY alt_thunk_names171[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C293fooEv,_ZThn28_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y0 = {  "G29x6y0", // class name
  bases_G29x6y0, 6,
  &(vtc_G29x6y0[0]), // expected_vtbl_contents
  &(vtt_G29x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y0),12, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names171,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y1  : virtual E29x6 , F1 {
  int ff;
  ~G29x6y1(); // tgen
  G29x6y1(); // tgen
};
//SIG(1 G29x6y1) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x6y1 ::~G29x6y1(){ note_dtor("G29x6y1", this);} // tgen
G29x6y1 ::G29x6y1(){ note_ctor("G29x6y1", this);} // tgen

static void Test_G29x6y1()
{
  extern Class_Descriptor cd_G29x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x6y1, buf);
    G29x6y1 *dp, &lv = *(dp=new (buf) G29x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y1)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), ABISELECT(16,12), "G29x6y1");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(40,28), "G29x6y1");
    check_base_class_offset(lv, (C29*)(E29x6*), ABISELECT(16,12), "G29x6y1");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(52,36), "G29x6y1");
    check_base_class_offset(lv, (E29x6*), ABISELECT(16,12), "G29x6y1");
    check_base_class_offset(lv, (F1*), 0, "G29x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x6y1.ff");
    test_class_info(&lv, &cd_G29x6y1);
    dp->~G29x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y1(Test_G29x6y1, "G29x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x6y1C1Ev();
extern void _ZN7G29x6y1D1Ev();
Name_Map name_map_G29x6y1[] = {
  NSPAIR(_ZN7G29x6y1C1Ev),
  NSPAIR(_ZN7G29x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x6y1[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x6y1[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y1[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y1[] = {
  {&(_ZTV7G29x6y1[5]),  5,16},
  {&(_ZTV7G29x6y1[11]),  11,16},
  {&(_ZTV7G29x6y1[15]),  15,16},
  {&(_tg__ZTV5E29x6__7G29x6y1[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x6y1[];
extern  VTBL_ENTRY _ZTV7G29x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y1[];
static VTBL_ENTRY alt_thunk_names172[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y1 = {  "G29x6y1", // class name
  bases_G29x6y1, 6,
  &(vtc_G29x6y1[0]), // expected_vtbl_contents
  &(vtt_G29x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y1),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names172,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y2  : E29x6 , virtual F1 {
  int ff;
  ~G29x6y2(); // tgen
  G29x6y2(); // tgen
};
//SIG(1 G29x6y2) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x6y2 ::~G29x6y2(){ note_dtor("G29x6y2", this);} // tgen
G29x6y2 ::G29x6y2(){ note_ctor("G29x6y2", this);} // tgen

static void Test_G29x6y2()
{
  extern Class_Descriptor cd_G29x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x6y2, buf);
    G29x6y2 *dp, &lv = *(dp=new (buf) G29x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y2)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), 0, "G29x6y2");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(24,20), "G29x6y2");
    check_base_class_offset(lv, (C29*)(E29x6*), 0, "G29x6y2");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(36,28), "G29x6y2");
    check_base_class_offset(lv, (E29x6*), 0, "G29x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G29x6y2");
    check_field_offset(lv, ff, ABISELECT(20,16), "G29x6y2.ff");
    test_class_info(&lv, &cd_G29x6y2);
    dp->~G29x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y2(Test_G29x6y2, "G29x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x6y2C1Ev();
extern void _ZN7G29x6y2D1Ev();
Name_Map name_map_G29x6y2[] = {
  NSPAIR(_ZN7G29x6y2C1Ev),
  NSPAIR(_ZN7G29x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y2[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y2[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G29x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G29x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x6y2[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y2[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y2[] = {
  {&(_ZTV7G29x6y2[5]),  5,14},
  {&(_tg__ZTV5E29x6__7G29x6y2[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y2[3]),  3,4},
  {&(_ZTV7G29x6y2[9]),  9,14},
  {&(_ZTV7G29x6y2[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G29x6y2[];
extern  VTBL_ENTRY _ZTV7G29x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y2[];
static VTBL_ENTRY alt_thunk_names173[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y2 = {  "G29x6y2", // class name
  bases_G29x6y2, 6,
  &(vtc_G29x6y2[0]), // expected_vtbl_contents
  &(vtt_G29x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y2),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names173,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y3  : virtual E29x6 , virtual F1 {
  int ff;
  ~G29x6y3(); // tgen
  G29x6y3(); // tgen
};
//SIG(1 G29x6y3) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x6y3 ::~G29x6y3(){ note_dtor("G29x6y3", this);} // tgen
G29x6y3 ::G29x6y3(){ note_ctor("G29x6y3", this);} // tgen

static void Test_G29x6y3()
{
  extern Class_Descriptor cd_G29x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x6y3, buf);
    G29x6y3 *dp, &lv = *(dp=new (buf) G29x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y3)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), ABISELECT(16,8), "G29x6y3");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(40,24), "G29x6y3");
    check_base_class_offset(lv, (C29*)(E29x6*), ABISELECT(16,8), "G29x6y3");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(52,32), "G29x6y3");
    check_base_class_offset(lv, (E29x6*), ABISELECT(16,8), "G29x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G29x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x6y3.ff");
    test_class_info(&lv, &cd_G29x6y3);
    dp->~G29x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y3(Test_G29x6y3, "G29x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G29x6y3C1Ev();
extern void _ZN7G29x6y3D1Ev();
Name_Map name_map_G29x6y3[] = {
  NSPAIR(_ZN7G29x6y3C1Ev),
  NSPAIR(_ZN7G29x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y3[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x6y3[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G29x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G29x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x6y3[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y3[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y3[] = {
  {&(_ZTV7G29x6y3[6]),  6,20},
  {&(_ZTV7G29x6y3[11]),  11,20},
  {&(_ZTV7G29x6y3[15]),  15,20},
  {&(_ZTV7G29x6y3[19]),  19,20},
  {&(_tg__ZTV5E29x6__7G29x6y3[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x6y3[];
extern  VTBL_ENTRY _ZTV7G29x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y3[];
static VTBL_ENTRY alt_thunk_names174[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y3 = {  "G29x6y3", // class name
  bases_G29x6y3, 6,
  &(vtc_G29x6y3[0]), // expected_vtbl_contents
  &(vtt_G29x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G29x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y3),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names174,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y4  : E29x6 , F0 {
  int ff;
  ~G29x6y4(); // tgen
  G29x6y4(); // tgen
};
//SIG(1 G29x6y4) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G29x6y4 ::~G29x6y4(){ note_dtor("G29x6y4", this);} // tgen
G29x6y4 ::G29x6y4(){ note_ctor("G29x6y4", this);} // tgen

static void Test_G29x6y4()
{
  extern Class_Descriptor cd_G29x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x6y4, buf);
    G29x6y4 *dp, &lv = *(dp=new (buf) G29x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y4)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), 0, "G29x6y4");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(32,24), "G29x6y4");
    check_base_class_offset(lv, (C29*)(E29x6*), 0, "G29x6y4");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(44,32), "G29x6y4");
    check_base_class_offset(lv, (E29x6*), 0, "G29x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(20,16), "G29x6y4");
    check_field_offset(lv, ff, ABISELECT(24,20), "G29x6y4.ff");
    test_class_info(&lv, &cd_G29x6y4);
    dp->~G29x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y4(Test_G29x6y4, "G29x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G29x6y4C1Ev();
extern void _ZN7G29x6y4D1Ev();
Name_Map name_map_G29x6y4[] = {
  NSPAIR(_ZN7G29x6y4C1Ev),
  NSPAIR(_ZN7G29x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y4[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x6y4[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y4[] = {
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y4[] = {
  {&(_ZTV7G29x6y4[4]),  4,9},
  {&(_tg__ZTV5E29x6__7G29x6y4[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y4[3]),  3,4},
  {&(_ZTV7G29x6y4[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G29x6y4[];
extern  VTBL_ENTRY _ZTV7G29x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y4[];
static VTBL_ENTRY alt_thunk_names175[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C293fooEv,_ZThn24_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y4 = {  "G29x6y4", // class name
  bases_G29x6y4, 6,
  &(vtc_G29x6y4[0]), // expected_vtbl_contents
  &(vtt_G29x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G29x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y4),9, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names175,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y5  : virtual E29x6 , F0 {
  int ff;
  ~G29x6y5(); // tgen
  G29x6y5(); // tgen
};
//SIG(1 G29x6y5) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G29x6y5 ::~G29x6y5(){ note_dtor("G29x6y5", this);} // tgen
G29x6y5 ::G29x6y5(){ note_ctor("G29x6y5", this);} // tgen

static void Test_G29x6y5()
{
  extern Class_Descriptor cd_G29x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x6y5, buf);
    G29x6y5 *dp, &lv = *(dp=new (buf) G29x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y5)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), ABISELECT(16,12), "G29x6y5");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(40,28), "G29x6y5");
    check_base_class_offset(lv, (C29*)(E29x6*), ABISELECT(16,12), "G29x6y5");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(52,36), "G29x6y5");
    check_base_class_offset(lv, (E29x6*), ABISELECT(16,12), "G29x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x6y5.ff");
    test_class_info(&lv, &cd_G29x6y5);
    dp->~G29x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y5(Test_G29x6y5, "G29x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x6y5C1Ev();
extern void _ZN7G29x6y5D1Ev();
Name_Map name_map_G29x6y5[] = {
  NSPAIR(_ZN7G29x6y5C1Ev),
  NSPAIR(_ZN7G29x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y5[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x6y5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x6y5[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y5[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y5[] = {
  {&(_ZTV7G29x6y5[5]),  5,15},
  {&(_ZTV7G29x6y5[10]),  10,15},
  {&(_ZTV7G29x6y5[14]),  14,15},
  {&(_tg__ZTV5E29x6__7G29x6y5[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x6y5[];
extern  VTBL_ENTRY _ZTV7G29x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y5[];
static VTBL_ENTRY alt_thunk_names176[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y5 = {  "G29x6y5", // class name
  bases_G29x6y5, 6,
  &(vtc_G29x6y5[0]), // expected_vtbl_contents
  &(vtt_G29x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y5),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names176,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y6  : E29x6 , virtual F0 {
  int ff;
  ~G29x6y6(); // tgen
  G29x6y6(); // tgen
};
//SIG(1 G29x6y6) C1{ BC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x6y6 ::~G29x6y6(){ note_dtor("G29x6y6", this);} // tgen
G29x6y6 ::G29x6y6(){ note_ctor("G29x6y6", this);} // tgen

static void Test_G29x6y6()
{
  extern Class_Descriptor cd_G29x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G29x6y6, buf);
    G29x6y6 *dp, &lv = *(dp=new (buf) G29x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G29x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y6)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), 0, "G29x6y6");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(24,20), "G29x6y6");
    check_base_class_offset(lv, (C29*)(E29x6*), 0, "G29x6y6");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(36,28), "G29x6y6");
    check_base_class_offset(lv, (E29x6*), 0, "G29x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G29x6y6");
    check_field_offset(lv, ff, ABISELECT(20,16), "G29x6y6.ff");
    test_class_info(&lv, &cd_G29x6y6);
    dp->~G29x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y6(Test_G29x6y6, "G29x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G29x6y6C1Ev();
extern void _ZN7G29x6y6D1Ev();
Name_Map name_map_G29x6y6[] = {
  NSPAIR(_ZN7G29x6y6C1Ev),
  NSPAIR(_ZN7G29x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y6[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G29x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x6y6[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y6[] = {
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y6[] = {
  {&(_ZTV7G29x6y6[5]),  5,10},
  {&(_tg__ZTV5E29x6__7G29x6y6[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y6[3]),  3,4},
  {&(_ZTV7G29x6y6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G29x6y6[];
extern  VTBL_ENTRY _ZTV7G29x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y6[];
static VTBL_ENTRY alt_thunk_names177[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn20_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y6 = {  "G29x6y6", // class name
  bases_G29x6y6, 6,
  &(vtc_G29x6y6[0]), // expected_vtbl_contents
  &(vtt_G29x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G29x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names177,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x6y7  : virtual E29x6 , virtual F0 {
  int ff;
  ~G29x6y7(); // tgen
  G29x6y7(); // tgen
};
//SIG(1 G29x6y7) C1{ VBC2{ BC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x6y7 ::~G29x6y7(){ note_dtor("G29x6y7", this);} // tgen
G29x6y7 ::G29x6y7(){ note_ctor("G29x6y7", this);} // tgen

static void Test_G29x6y7()
{
  extern Class_Descriptor cd_G29x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G29x6y7, buf);
    G29x6y7 *dp, &lv = *(dp=new (buf) G29x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G29x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x6y7)");
    check_base_class_offset(lv, (A1*)(C29*)(E29x6*), ABISELECT(16,8), "G29x6y7");
    check_base_class_offset(lv, (B1*)(C29*)(E29x6*), ABISELECT(40,24), "G29x6y7");
    check_base_class_offset(lv, (C29*)(E29x6*), ABISELECT(16,8), "G29x6y7");
    check_base_class_offset(lv, (D0*)(E29x6*), ABISELECT(52,32), "G29x6y7");
    check_base_class_offset(lv, (E29x6*), ABISELECT(16,8), "G29x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G29x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x6y7.ff");
    test_class_info(&lv, &cd_G29x6y7);
    dp->~G29x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x6y7(Test_G29x6y7, "G29x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G29x6y7C1Ev();
extern void _ZN7G29x6y7D1Ev();
Name_Map name_map_G29x6y7[] = {
  NSPAIR(_ZN7G29x6y7C1Ev),
  NSPAIR(_ZN7G29x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x6;
extern VTBL_ENTRY _ZTI5E29x6[];
extern  VTBL_ENTRY _ZTV5E29x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x6,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x6y7[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x6y7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G29x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x6y7[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV5E29x6__7G29x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C295E29x6__7G29x6y7[] = {
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C295E29x6__7G29x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x6__7G29x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x6y7[] = {
  {&(_ZTV7G29x6y7[6]),  6,16},
  {&(_ZTV7G29x6y7[11]),  11,16},
  {&(_ZTV7G29x6y7[15]),  15,16},
  {&(_tg__ZTV5E29x6__7G29x6y7[4]),  4,5},
  {&(_tg__ZTV3C295E29x6__7G29x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C295E29x6__7G29x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E29x6__7G29x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x6y7[];
extern  VTBL_ENTRY _ZTV7G29x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x6y7[];
static VTBL_ENTRY alt_thunk_names178[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C293fooEv,_ZThn16_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x6y7 = {  "G29x6y7", // class name
  bases_G29x6y7, 6,
  &(vtc_G29x6y7[0]), // expected_vtbl_contents
  &(vtt_G29x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G29x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x6y7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x6y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names178,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x6  : C30 , virtual D0 {
  int fd;
  ~E30x6(); // tgen
  E30x6(); // tgen
};
//SIG(-1 E30x6) C1{ BC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E30x6 ::~E30x6(){ note_dtor("E30x6", this);} // tgen
E30x6 ::E30x6(){ note_ctor("E30x6", this);} // tgen

static void Test_E30x6()
{
  extern Class_Descriptor cd_E30x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E30x6, buf);
    E30x6 *dp, &lv = *(dp=new (buf) E30x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E30x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x6)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(16,12), "E30x6");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(24,16), "E30x6");
    check_base_class_offset(lv, (C30*), 0, "E30x6");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E30x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E30x6.fd");
    test_class_info(&lv, &cd_E30x6);
    dp->~E30x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x6(Test_E30x6, "E30x6", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E30x6C1Ev();
extern void _ZN5E30x6D1Ev();
Name_Map name_map_E30x6[] = {
  NSPAIR(_ZN5E30x6C1Ev),
  NSPAIR(_ZN5E30x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E30x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E30x6[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x6[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV5E30x6[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x6[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__5E30x6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x6[] = {
  {&(_ZTV5E30x6[5]),  5,10},
  {&(_tg__ZTV3C30__5E30x6[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__5E30x6[3]),  3,4},
  {&(_ZTV5E30x6[9]),  9,10},
};
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
static VTBL_ENTRY alt_thunk_names179[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x6 = {  "E30x6", // class name
  bases_E30x6, 4,
  &(vtc_E30x6[0]), // expected_vtbl_contents
  &(vtt_E30x6[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E30x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E30x6),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E30x6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names179,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y0  : E30x6 , F1 {
  int ff;
  ~G30x6y0(); // tgen
  G30x6y0(); // tgen
};
//SIG(1 G30x6y0) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x6y0 ::~G30x6y0(){ note_dtor("G30x6y0", this);} // tgen
G30x6y0 ::G30x6y0(){ note_ctor("G30x6y0", this);} // tgen

static void Test_G30x6y0()
{
  extern Class_Descriptor cd_G30x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x6y0, buf);
    G30x6y0 *dp, &lv = *(dp=new (buf) G30x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y0)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(32,24), "G30x6y0");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(40,28), "G30x6y0");
    check_base_class_offset(lv, (C30*)(E30x6*), 0, "G30x6y0");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(52,36), "G30x6y0");
    check_base_class_offset(lv, (E30x6*), 0, "G30x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G30x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G30x6y0.ff");
    test_class_info(&lv, &cd_G30x6y0);
    dp->~G30x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y0(Test_G30x6y0, "G30x6y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x6y0C1Ev();
extern void _ZN7G30x6y0D1Ev();
Name_Map name_map_G30x6y0[] = {
  NSPAIR(_ZN7G30x6y0C1Ev),
  NSPAIR(_ZN7G30x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y0[];
extern void _ZN3C303fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y0[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x6y0[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y0[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y0[] = {
  ABISELECT(40,28),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y0[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y0[] = {
  {&(_ZTV7G30x6y0[5]),  5,13},
  {&(_tg__ZTV5E30x6__7G30x6y0[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y0[3]),  3,4},
  {&(_ZTV7G30x6y0[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G30x6y0[];
extern  VTBL_ENTRY _ZTV7G30x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y0[];
static VTBL_ENTRY alt_thunk_names180[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C303fooEv,_ZThn28_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y0 = {  "G30x6y0", // class name
  bases_G30x6y0, 6,
  &(vtc_G30x6y0[0]), // expected_vtbl_contents
  &(vtt_G30x6y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y0),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names180,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y1  : virtual E30x6 , F1 {
  int ff;
  ~G30x6y1(); // tgen
  G30x6y1(); // tgen
};
//SIG(1 G30x6y1) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x6y1 ::~G30x6y1(){ note_dtor("G30x6y1", this);} // tgen
G30x6y1 ::G30x6y1(){ note_ctor("G30x6y1", this);} // tgen

static void Test_G30x6y1()
{
  extern Class_Descriptor cd_G30x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x6y1, buf);
    G30x6y1 *dp, &lv = *(dp=new (buf) G30x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y1)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(32,24), "G30x6y1");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(40,28), "G30x6y1");
    check_base_class_offset(lv, (C30*)(E30x6*), ABISELECT(16,12), "G30x6y1");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(52,36), "G30x6y1");
    check_base_class_offset(lv, (E30x6*), ABISELECT(16,12), "G30x6y1");
    check_base_class_offset(lv, (F1*), 0, "G30x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x6y1.ff");
    test_class_info(&lv, &cd_G30x6y1);
    dp->~G30x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y1(Test_G30x6y1, "G30x6y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x6y1C1Ev();
extern void _ZN7G30x6y1D1Ev();
Name_Map name_map_G30x6y1[] = {
  NSPAIR(_ZN7G30x6y1C1Ev),
  NSPAIR(_ZN7G30x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x6y1[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x6y1[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x6y1[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y1[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y1[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y1[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y1[] = {
  {&(_ZTV7G30x6y1[6]),  6,18},
  {&(_ZTV7G30x6y1[13]),  13,18},
  {&(_ZTV7G30x6y1[17]),  17,18},
  {&(_tg__ZTV5E30x6__7G30x6y1[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x6y1[];
extern  VTBL_ENTRY _ZTV7G30x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y1[];
static VTBL_ENTRY alt_thunk_names181[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y1 = {  "G30x6y1", // class name
  bases_G30x6y1, 6,
  &(vtc_G30x6y1[0]), // expected_vtbl_contents
  &(vtt_G30x6y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y1),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y1),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names181,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y2  : E30x6 , virtual F1 {
  int ff;
  ~G30x6y2(); // tgen
  G30x6y2(); // tgen
};
//SIG(1 G30x6y2) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x6y2 ::~G30x6y2(){ note_dtor("G30x6y2", this);} // tgen
G30x6y2 ::G30x6y2(){ note_ctor("G30x6y2", this);} // tgen

static void Test_G30x6y2()
{
  extern Class_Descriptor cd_G30x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x6y2, buf);
    G30x6y2 *dp, &lv = *(dp=new (buf) G30x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y2)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(20,16), "G30x6y2");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(24,20), "G30x6y2");
    check_base_class_offset(lv, (C30*)(E30x6*), 0, "G30x6y2");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(36,28), "G30x6y2");
    check_base_class_offset(lv, (E30x6*), 0, "G30x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G30x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x6y2.ff");
    test_class_info(&lv, &cd_G30x6y2);
    dp->~G30x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y2(Test_G30x6y2, "G30x6y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x6y2C1Ev();
extern void _ZN7G30x6y2D1Ev();
Name_Map name_map_G30x6y2[] = {
  NSPAIR(_ZN7G30x6y2C1Ev),
  NSPAIR(_ZN7G30x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y2[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x6y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y2[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G30x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G30x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x6y2[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y2[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y2[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y2[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y2[] = {
  {&(_ZTV7G30x6y2[6]),  6,15},
  {&(_tg__ZTV5E30x6__7G30x6y2[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y2[3]),  3,4},
  {&(_ZTV7G30x6y2[10]),  10,15},
  {&(_ZTV7G30x6y2[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G30x6y2[];
extern  VTBL_ENTRY _ZTV7G30x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y2[];
static VTBL_ENTRY alt_thunk_names182[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y2 = {  "G30x6y2", // class name
  bases_G30x6y2, 6,
  &(vtc_G30x6y2[0]), // expected_vtbl_contents
  &(vtt_G30x6y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y2),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names182,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y3  : virtual E30x6 , virtual F1 {
  int ff;
  ~G30x6y3(); // tgen
  G30x6y3(); // tgen
};
//SIG(1 G30x6y3) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x6y3 ::~G30x6y3(){ note_dtor("G30x6y3", this);} // tgen
G30x6y3 ::G30x6y3(){ note_ctor("G30x6y3", this);} // tgen

static void Test_G30x6y3()
{
  extern Class_Descriptor cd_G30x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x6y3, buf);
    G30x6y3 *dp, &lv = *(dp=new (buf) G30x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y3)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(32,20), "G30x6y3");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(40,24), "G30x6y3");
    check_base_class_offset(lv, (C30*)(E30x6*), ABISELECT(16,8), "G30x6y3");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(52,32), "G30x6y3");
    check_base_class_offset(lv, (E30x6*), ABISELECT(16,8), "G30x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G30x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x6y3.ff");
    test_class_info(&lv, &cd_G30x6y3);
    dp->~G30x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y3(Test_G30x6y3, "G30x6y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G30x6y3C1Ev();
extern void _ZN7G30x6y3D1Ev();
Name_Map name_map_G30x6y3[] = {
  NSPAIR(_ZN7G30x6y3C1Ev),
  NSPAIR(_ZN7G30x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y3[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x6y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y3[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x6y3[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G30x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G30x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x6y3[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y3[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y3[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y3[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y3[] = {
  {&(_ZTV7G30x6y3[7]),  7,22},
  {&(_ZTV7G30x6y3[13]),  13,22},
  {&(_ZTV7G30x6y3[17]),  17,22},
  {&(_ZTV7G30x6y3[21]),  21,22},
  {&(_tg__ZTV5E30x6__7G30x6y3[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x6y3[];
extern  VTBL_ENTRY _ZTV7G30x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y3[];
static VTBL_ENTRY alt_thunk_names183[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y3 = {  "G30x6y3", // class name
  bases_G30x6y3, 6,
  &(vtc_G30x6y3[0]), // expected_vtbl_contents
  &(vtt_G30x6y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G30x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y3),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y3),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names183,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y4  : E30x6 , F0 {
  int ff;
  ~G30x6y4(); // tgen
  G30x6y4(); // tgen
};
//SIG(1 G30x6y4) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G30x6y4 ::~G30x6y4(){ note_dtor("G30x6y4", this);} // tgen
G30x6y4 ::G30x6y4(){ note_ctor("G30x6y4", this);} // tgen

static void Test_G30x6y4()
{
  extern Class_Descriptor cd_G30x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x6y4, buf);
    G30x6y4 *dp, &lv = *(dp=new (buf) G30x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y4)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(24,20), "G30x6y4");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(32,24), "G30x6y4");
    check_base_class_offset(lv, (C30*)(E30x6*), 0, "G30x6y4");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(44,32), "G30x6y4");
    check_base_class_offset(lv, (E30x6*), 0, "G30x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G30x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G30x6y4.ff");
    test_class_info(&lv, &cd_G30x6y4);
    dp->~G30x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y4(Test_G30x6y4, "G30x6y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G30x6y4C1Ev();
extern void _ZN7G30x6y4D1Ev();
Name_Map name_map_G30x6y4[] = {
  NSPAIR(_ZN7G30x6y4C1Ev),
  NSPAIR(_ZN7G30x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y4[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x6y4[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y4[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y4[] = {
  ABISELECT(32,24),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y4[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y4[] = {
  {&(_ZTV7G30x6y4[5]),  5,10},
  {&(_tg__ZTV5E30x6__7G30x6y4[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y4[3]),  3,4},
  {&(_ZTV7G30x6y4[9]),  9,10},
};
extern VTBL_ENTRY _ZTI7G30x6y4[];
extern  VTBL_ENTRY _ZTV7G30x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y4[];
static VTBL_ENTRY alt_thunk_names184[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C303fooEv,_ZThn24_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y4 = {  "G30x6y4", // class name
  bases_G30x6y4, 6,
  &(vtc_G30x6y4[0]), // expected_vtbl_contents
  &(vtt_G30x6y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G30x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y4),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names184,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y5  : virtual E30x6 , F0 {
  int ff;
  ~G30x6y5(); // tgen
  G30x6y5(); // tgen
};
//SIG(1 G30x6y5) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G30x6y5 ::~G30x6y5(){ note_dtor("G30x6y5", this);} // tgen
G30x6y5 ::G30x6y5(){ note_ctor("G30x6y5", this);} // tgen

static void Test_G30x6y5()
{
  extern Class_Descriptor cd_G30x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x6y5, buf);
    G30x6y5 *dp, &lv = *(dp=new (buf) G30x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y5)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(32,24), "G30x6y5");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(40,28), "G30x6y5");
    check_base_class_offset(lv, (C30*)(E30x6*), ABISELECT(16,12), "G30x6y5");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(52,36), "G30x6y5");
    check_base_class_offset(lv, (E30x6*), ABISELECT(16,12), "G30x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x6y5.ff");
    test_class_info(&lv, &cd_G30x6y5);
    dp->~G30x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y5(Test_G30x6y5, "G30x6y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x6y5C1Ev();
extern void _ZN7G30x6y5D1Ev();
Name_Map name_map_G30x6y5[] = {
  NSPAIR(_ZN7G30x6y5C1Ev),
  NSPAIR(_ZN7G30x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y5[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x6y5[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y5[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x6y5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x6y5[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y5[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y5[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y5[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y5[] = {
  {&(_ZTV7G30x6y5[6]),  6,17},
  {&(_ZTV7G30x6y5[12]),  12,17},
  {&(_ZTV7G30x6y5[16]),  16,17},
  {&(_tg__ZTV5E30x6__7G30x6y5[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x6y5[];
extern  VTBL_ENTRY _ZTV7G30x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y5[];
static VTBL_ENTRY alt_thunk_names185[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y5 = {  "G30x6y5", // class name
  bases_G30x6y5, 6,
  &(vtc_G30x6y5[0]), // expected_vtbl_contents
  &(vtt_G30x6y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y5),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y5),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names185,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y6  : E30x6 , virtual F0 {
  int ff;
  ~G30x6y6(); // tgen
  G30x6y6(); // tgen
};
//SIG(1 G30x6y6) C1{ BC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x6y6 ::~G30x6y6(){ note_dtor("G30x6y6", this);} // tgen
G30x6y6 ::G30x6y6(){ note_ctor("G30x6y6", this);} // tgen

static void Test_G30x6y6()
{
  extern Class_Descriptor cd_G30x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G30x6y6, buf);
    G30x6y6 *dp, &lv = *(dp=new (buf) G30x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G30x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y6)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(20,16), "G30x6y6");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(24,20), "G30x6y6");
    check_base_class_offset(lv, (C30*)(E30x6*), 0, "G30x6y6");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(36,28), "G30x6y6");
    check_base_class_offset(lv, (E30x6*), 0, "G30x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G30x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x6y6.ff");
    test_class_info(&lv, &cd_G30x6y6);
    dp->~G30x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y6(Test_G30x6y6, "G30x6y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G30x6y6C1Ev();
extern void _ZN7G30x6y6D1Ev();
Name_Map name_map_G30x6y6[] = {
  NSPAIR(_ZN7G30x6y6C1Ev),
  NSPAIR(_ZN7G30x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y6[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x6y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G30x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x6y6[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y6[] = {
  ABISELECT(36,28),
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y6[] = {
  ABISELECT(24,20),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y6[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y6[] = {
  {&(_ZTV7G30x6y6[6]),  6,11},
  {&(_tg__ZTV5E30x6__7G30x6y6[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y6[3]),  3,4},
  {&(_ZTV7G30x6y6[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G30x6y6[];
extern  VTBL_ENTRY _ZTV7G30x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y6[];
static VTBL_ENTRY alt_thunk_names186[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn20_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y6 = {  "G30x6y6", // class name
  bases_G30x6y6, 6,
  &(vtc_G30x6y6[0]), // expected_vtbl_contents
  &(vtt_G30x6y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G30x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names186,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x6y7  : virtual E30x6 , virtual F0 {
  int ff;
  ~G30x6y7(); // tgen
  G30x6y7(); // tgen
};
//SIG(1 G30x6y7) C1{ VBC2{ BC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x6y7 ::~G30x6y7(){ note_dtor("G30x6y7", this);} // tgen
G30x6y7 ::G30x6y7(){ note_ctor("G30x6y7", this);} // tgen

static void Test_G30x6y7()
{
  extern Class_Descriptor cd_G30x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G30x6y7, buf);
    G30x6y7 *dp, &lv = *(dp=new (buf) G30x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G30x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x6y7)");
    check_base_class_offset(lv, (A0*)(C30*)(E30x6*), ABISELECT(32,20), "G30x6y7");
    check_base_class_offset(lv, (B1*)(C30*)(E30x6*), ABISELECT(40,24), "G30x6y7");
    check_base_class_offset(lv, (C30*)(E30x6*), ABISELECT(16,8), "G30x6y7");
    check_base_class_offset(lv, (D0*)(E30x6*), ABISELECT(52,32), "G30x6y7");
    check_base_class_offset(lv, (E30x6*), ABISELECT(16,8), "G30x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G30x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x6y7.ff");
    test_class_info(&lv, &cd_G30x6y7);
    dp->~G30x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x6y7(Test_G30x6y7, "G30x6y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G30x6y7C1Ev();
extern void _ZN7G30x6y7D1Ev();
Name_Map name_map_G30x6y7[] = {
  NSPAIR(_ZN7G30x6y7C1Ev),
  NSPAIR(_ZN7G30x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x6;
extern VTBL_ENTRY _ZTI5E30x6[];
extern  VTBL_ENTRY _ZTV5E30x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x6y7[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x6y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x6y7[0]),
  0,
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x6y7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G30x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x6y7[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV5E30x6__7G30x6y7[] = {
  ABISELECT(36,24),
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C305E30x6__7G30x6y7[] = {
  ABISELECT(24,16),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C305E30x6__7G30x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x6__7G30x6y7[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x6y7[] = {
  {&(_ZTV7G30x6y7[7]),  7,18},
  {&(_ZTV7G30x6y7[13]),  13,18},
  {&(_ZTV7G30x6y7[17]),  17,18},
  {&(_tg__ZTV5E30x6__7G30x6y7[5]),  5,6},
  {&(_tg__ZTV3C305E30x6__7G30x6y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C305E30x6__7G30x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E30x6__7G30x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x6y7[];
extern  VTBL_ENTRY _ZTV7G30x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x6y7[];
static VTBL_ENTRY alt_thunk_names187[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C303fooEv,_ZThn16_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x6y7 = {  "G30x6y7", // class name
  bases_G30x6y7, 6,
  &(vtc_G30x6y7[0]), // expected_vtbl_contents
  &(vtt_G30x6y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G30x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x6y7),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x6y7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names187,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x6  : C31 , virtual D0 {
  int fd;
  ~E31x6(); // tgen
  E31x6(); // tgen
};
//SIG(-1 E31x6) C1{ BC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E31x6 ::~E31x6(){ note_dtor("E31x6", this);} // tgen
E31x6 ::E31x6(){ note_ctor("E31x6", this);} // tgen

static void Test_E31x6()
{
  extern Class_Descriptor cd_E31x6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E31x6, buf);
    E31x6 *dp, &lv = *(dp=new (buf) E31x6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E31x6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x6)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(16,12), "E31x6");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(32,20), "E31x6");
    check_base_class_offset(lv, (C31*), 0, "E31x6");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E31x6");
    check_field_offset(lv, fd, ABISELECT(12,8), "E31x6.fd");
    test_class_info(&lv, &cd_E31x6);
    dp->~E31x6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x6(Test_E31x6, "E31x6", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E31x6C1Ev();
extern void _ZN5E31x6D1Ev();
Name_Map name_map_E31x6[] = {
  NSPAIR(_ZN5E31x6C1Ev),
  NSPAIR(_ZN5E31x6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E31x6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E31x6[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x6[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV5E31x6[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x6[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__5E31x6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__5E31x6[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x6[] = {
  {&(_ZTV5E31x6[5]),  5,14},
  {&(_tg__ZTV3C31__5E31x6[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__5E31x6[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__5E31x6[3]),  3,4},
  {&(_ZTV5E31x6[9]),  9,14},
  {&(_ZTV5E31x6[13]),  13,14},
};
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
static VTBL_ENTRY alt_thunk_names188[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x6 = {  "E31x6", // class name
  bases_E31x6, 4,
  &(vtc_E31x6[0]), // expected_vtbl_contents
  &(vtt_E31x6[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E31x6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E31x6),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E31x6),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names188,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y0  : E31x6 , F1 {
  int ff;
  ~G31x6y0(); // tgen
  G31x6y0(); // tgen
};
//SIG(1 G31x6y0) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x6y0 ::~G31x6y0(){ note_dtor("G31x6y0", this);} // tgen
G31x6y0 ::G31x6y0(){ note_ctor("G31x6y0", this);} // tgen

static void Test_G31x6y0()
{
  extern Class_Descriptor cd_G31x6y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G31x6y0, buf);
    G31x6y0 *dp, &lv = *(dp=new (buf) G31x6y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G31x6y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y0)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(32,24), "G31x6y0");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(48,32), "G31x6y0");
    check_base_class_offset(lv, (C31*)(E31x6*), 0, "G31x6y0");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(60,40), "G31x6y0");
    check_base_class_offset(lv, (E31x6*), 0, "G31x6y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,12), "G31x6y0");
    check_field_offset(lv, ff, ABISELECT(28,20), "G31x6y0.ff");
    test_class_info(&lv, &cd_G31x6y0);
    dp->~G31x6y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y0(Test_G31x6y0, "G31x6y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G31x6y0C1Ev();
extern void _ZN7G31x6y0D1Ev();
Name_Map name_map_G31x6y0[] = {
  NSPAIR(_ZN7G31x6y0C1Ev),
  NSPAIR(_ZN7G31x6y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x6y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y0[];
extern void _ZN3C313fooEv();
extern void _ZN2F13fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x6y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y0[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x6y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x6y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x6y0[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y0[] = {
  ABISELECT(48,32),
  ABISELECT(32,24),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y0[] = {
  ABISELECT(-32,-24),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y0[] = {
  ABISELECT(-48,-32),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y0[] = {
  {&(_ZTV7G31x6y0[5]),  5,17},
  {&(_tg__ZTV5E31x6__7G31x6y0[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y0[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y0[3]),  3,4},
  {&(_ZTV7G31x6y0[12]),  12,17},
  {&(_ZTV7G31x6y0[16]),  16,17},
};
extern VTBL_ENTRY _ZTI7G31x6y0[];
extern  VTBL_ENTRY _ZTV7G31x6y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y0[];
static VTBL_ENTRY alt_thunk_names189[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn48_N3C313fooEv,_ZThn32_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn24_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y0 = {  "G31x6y0", // class name
  bases_G31x6y0, 6,
  &(vtc_G31x6y0[0]), // expected_vtbl_contents
  &(vtt_G31x6y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G31x6y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y0),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names189,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y1  : virtual E31x6 , F1 {
  int ff;
  ~G31x6y1(); // tgen
  G31x6y1(); // tgen
};
//SIG(1 G31x6y1) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x6y1 ::~G31x6y1(){ note_dtor("G31x6y1", this);} // tgen
G31x6y1 ::G31x6y1(){ note_ctor("G31x6y1", this);} // tgen

static void Test_G31x6y1()
{
  extern Class_Descriptor cd_G31x6y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G31x6y1, buf);
    G31x6y1 *dp, &lv = *(dp=new (buf) G31x6y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G31x6y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y1)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(32,24), "G31x6y1");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(48,32), "G31x6y1");
    check_base_class_offset(lv, (C31*)(E31x6*), ABISELECT(16,12), "G31x6y1");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(60,40), "G31x6y1");
    check_base_class_offset(lv, (E31x6*), ABISELECT(16,12), "G31x6y1");
    check_base_class_offset(lv, (F1*), 0, "G31x6y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x6y1.ff");
    test_class_info(&lv, &cd_G31x6y1);
    dp->~G31x6y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y1(Test_G31x6y1, "G31x6y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G31x6y1C1Ev();
extern void _ZN7G31x6y1D1Ev();
Name_Map name_map_G31x6y1[] = {
  NSPAIR(_ZN7G31x6y1C1Ev),
  NSPAIR(_ZN7G31x6y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x6y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x6y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x6y1[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x6y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x6y1[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y1[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y1[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y1[] = {
  {&(_ZTV7G31x6y1[6]),  6,22},
  {&(_ZTV7G31x6y1[13]),  13,22},
  {&(_ZTV7G31x6y1[17]),  17,22},
  {&(_ZTV7G31x6y1[21]),  21,22},
  {&(_tg__ZTV5E31x6__7G31x6y1[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y1[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x6y1[];
extern  VTBL_ENTRY _ZTV7G31x6y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y1[];
static VTBL_ENTRY alt_thunk_names190[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y1 = {  "G31x6y1", // class name
  bases_G31x6y1, 6,
  &(vtc_G31x6y1[0]), // expected_vtbl_contents
  &(vtt_G31x6y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G31x6y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y1),22, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y1),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names190,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y2  : E31x6 , virtual F1 {
  int ff;
  ~G31x6y2(); // tgen
  G31x6y2(); // tgen
};
//SIG(1 G31x6y2) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x6y2 ::~G31x6y2(){ note_dtor("G31x6y2", this);} // tgen
G31x6y2 ::G31x6y2(){ note_ctor("G31x6y2", this);} // tgen

static void Test_G31x6y2()
{
  extern Class_Descriptor cd_G31x6y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x6y2, buf);
    G31x6y2 *dp, &lv = *(dp=new (buf) G31x6y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x6y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y2)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(24,16), "G31x6y2");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(40,24), "G31x6y2");
    check_base_class_offset(lv, (C31*)(E31x6*), 0, "G31x6y2");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(52,32), "G31x6y2");
    check_base_class_offset(lv, (E31x6*), 0, "G31x6y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G31x6y2");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x6y2.ff");
    test_class_info(&lv, &cd_G31x6y2);
    dp->~G31x6y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y2(Test_G31x6y2, "G31x6y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x6y2C1Ev();
extern void _ZN7G31x6y2D1Ev();
Name_Map name_map_G31x6y2[] = {
  NSPAIR(_ZN7G31x6y2C1Ev),
  NSPAIR(_ZN7G31x6y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x6y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    10, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y2[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x6y2[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y2[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G31x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x6y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G31x6y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x6y2[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y2[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y2[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y2[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y2[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y2[] = {
  {&(_ZTV7G31x6y2[6]),  6,19},
  {&(_tg__ZTV5E31x6__7G31x6y2[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y2[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y2[3]),  3,4},
  {&(_ZTV7G31x6y2[10]),  10,19},
  {&(_ZTV7G31x6y2[14]),  14,19},
  {&(_ZTV7G31x6y2[18]),  18,19},
};
extern VTBL_ENTRY _ZTI7G31x6y2[];
extern  VTBL_ENTRY _ZTV7G31x6y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y2[];
static VTBL_ENTRY alt_thunk_names191[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y2 = {  "G31x6y2", // class name
  bases_G31x6y2, 6,
  &(vtc_G31x6y2[0]), // expected_vtbl_contents
  &(vtt_G31x6y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x6y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y2),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names191,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y3  : virtual E31x6 , virtual F1 {
  int ff;
  ~G31x6y3(); // tgen
  G31x6y3(); // tgen
};
//SIG(1 G31x6y3) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x6y3 ::~G31x6y3(){ note_dtor("G31x6y3", this);} // tgen
G31x6y3 ::G31x6y3(){ note_ctor("G31x6y3", this);} // tgen

static void Test_G31x6y3()
{
  extern Class_Descriptor cd_G31x6y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x6y3, buf);
    G31x6y3 *dp, &lv = *(dp=new (buf) G31x6y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x6y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y3)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(32,20), "G31x6y3");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(48,28), "G31x6y3");
    check_base_class_offset(lv, (C31*)(E31x6*), ABISELECT(16,8), "G31x6y3");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(60,36), "G31x6y3");
    check_base_class_offset(lv, (E31x6*), ABISELECT(16,8), "G31x6y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G31x6y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x6y3.ff");
    test_class_info(&lv, &cd_G31x6y3);
    dp->~G31x6y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y3(Test_G31x6y3, "G31x6y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x6y3C1Ev();
extern void _ZN7G31x6y3D1Ev();
Name_Map name_map_G31x6y3[] = {
  NSPAIR(_ZN7G31x6y3C1Ev),
  NSPAIR(_ZN7G31x6y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x6y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y3[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x6y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y3[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x6y3[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x6y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G31x6y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x6y3[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y3[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y3[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y3[] = {
  {&(_ZTV7G31x6y3[7]),  7,26},
  {&(_ZTV7G31x6y3[13]),  13,26},
  {&(_ZTV7G31x6y3[17]),  17,26},
  {&(_ZTV7G31x6y3[21]),  21,26},
  {&(_ZTV7G31x6y3[25]),  25,26},
  {&(_tg__ZTV5E31x6__7G31x6y3[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y3[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x6y3[];
extern  VTBL_ENTRY _ZTV7G31x6y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y3[];
static VTBL_ENTRY alt_thunk_names192[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y3 = {  "G31x6y3", // class name
  bases_G31x6y3, 6,
  &(vtc_G31x6y3[0]), // expected_vtbl_contents
  &(vtt_G31x6y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x6y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y3),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y3),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names192,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y4  : E31x6 , F0 {
  int ff;
  ~G31x6y4(); // tgen
  G31x6y4(); // tgen
};
//SIG(1 G31x6y4) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G31x6y4 ::~G31x6y4(){ note_dtor("G31x6y4", this);} // tgen
G31x6y4 ::G31x6y4(){ note_ctor("G31x6y4", this);} // tgen

static void Test_G31x6y4()
{
  extern Class_Descriptor cd_G31x6y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G31x6y4, buf);
    G31x6y4 *dp, &lv = *(dp=new (buf) G31x6y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G31x6y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y4)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(24,20), "G31x6y4");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(40,28), "G31x6y4");
    check_base_class_offset(lv, (C31*)(E31x6*), 0, "G31x6y4");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(52,36), "G31x6y4");
    check_base_class_offset(lv, (E31x6*), 0, "G31x6y4");
    check_base_class_offset(lv, (F0*), ABISELECT(16,12), "G31x6y4");
    check_field_offset(lv, ff, ABISELECT(20,16), "G31x6y4.ff");
    test_class_info(&lv, &cd_G31x6y4);
    dp->~G31x6y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y4(Test_G31x6y4, "G31x6y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G31x6y4C1Ev();
extern void _ZN7G31x6y4D1Ev();
Name_Map name_map_G31x6y4[] = {
  NSPAIR(_ZN7G31x6y4C1Ev),
  NSPAIR(_ZN7G31x6y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x6y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,20), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y4[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x6y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI7G31x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G31x6y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x6y4[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y4[] = {
  ABISELECT(40,28),
  ABISELECT(24,20),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y4[] = {
  ABISELECT(-24,-20),
  ABISELECT(-24,-20),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y4[] = {
  ABISELECT(-40,-28),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y4[] = {
  {&(_ZTV7G31x6y4[5]),  5,14},
  {&(_tg__ZTV5E31x6__7G31x6y4[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y4[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y4[3]),  3,4},
  {&(_ZTV7G31x6y4[9]),  9,14},
  {&(_ZTV7G31x6y4[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G31x6y4[];
extern  VTBL_ENTRY _ZTV7G31x6y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y4[];
static VTBL_ENTRY alt_thunk_names193[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn28_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn20_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y4 = {  "G31x6y4", // class name
  bases_G31x6y4, 6,
  &(vtc_G31x6y4[0]), // expected_vtbl_contents
  &(vtt_G31x6y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G31x6y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y4),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names193,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y5  : virtual E31x6 , F0 {
  int ff;
  ~G31x6y5(); // tgen
  G31x6y5(); // tgen
};
//SIG(1 G31x6y5) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G31x6y5 ::~G31x6y5(){ note_dtor("G31x6y5", this);} // tgen
G31x6y5 ::G31x6y5(){ note_ctor("G31x6y5", this);} // tgen

static void Test_G31x6y5()
{
  extern Class_Descriptor cd_G31x6y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G31x6y5, buf);
    G31x6y5 *dp, &lv = *(dp=new (buf) G31x6y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G31x6y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y5)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(32,24), "G31x6y5");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(48,32), "G31x6y5");
    check_base_class_offset(lv, (C31*)(E31x6*), ABISELECT(16,12), "G31x6y5");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(60,40), "G31x6y5");
    check_base_class_offset(lv, (E31x6*), ABISELECT(16,12), "G31x6y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x6y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x6y5.ff");
    test_class_info(&lv, &cd_G31x6y5);
    dp->~G31x6y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y5(Test_G31x6y5, "G31x6y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G31x6y5C1Ev();
extern void _ZN7G31x6y5D1Ev();
Name_Map name_map_G31x6y5[] = {
  NSPAIR(_ZN7G31x6y5C1Ev),
  NSPAIR(_ZN7G31x6y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x6y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y5[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x6y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y5[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x6y5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G31x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G31x6y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x6y5[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y5[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y5[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y5[] = {
  {&(_ZTV7G31x6y5[6]),  6,21},
  {&(_ZTV7G31x6y5[12]),  12,21},
  {&(_ZTV7G31x6y5[16]),  16,21},
  {&(_ZTV7G31x6y5[20]),  20,21},
  {&(_tg__ZTV5E31x6__7G31x6y5[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y5[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x6y5[];
extern  VTBL_ENTRY _ZTV7G31x6y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y5[];
static VTBL_ENTRY alt_thunk_names194[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y5 = {  "G31x6y5", // class name
  bases_G31x6y5, 6,
  &(vtc_G31x6y5[0]), // expected_vtbl_contents
  &(vtt_G31x6y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G31x6y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y5),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y5),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names194,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y6  : E31x6 , virtual F0 {
  int ff;
  ~G31x6y6(); // tgen
  G31x6y6(); // tgen
};
//SIG(1 G31x6y6) C1{ BC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x6y6 ::~G31x6y6(){ note_dtor("G31x6y6", this);} // tgen
G31x6y6 ::G31x6y6(){ note_ctor("G31x6y6", this);} // tgen

static void Test_G31x6y6()
{
  extern Class_Descriptor cd_G31x6y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G31x6y6, buf);
    G31x6y6 *dp, &lv = *(dp=new (buf) G31x6y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G31x6y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y6)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(24,16), "G31x6y6");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(40,24), "G31x6y6");
    check_base_class_offset(lv, (C31*)(E31x6*), 0, "G31x6y6");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(52,32), "G31x6y6");
    check_base_class_offset(lv, (E31x6*), 0, "G31x6y6");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G31x6y6");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x6y6.ff");
    test_class_info(&lv, &cd_G31x6y6);
    dp->~G31x6y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y6(Test_G31x6y6, "G31x6y6", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G31x6y6C1Ev();
extern void _ZN7G31x6y6D1Ev();
Name_Map name_map_G31x6y6[] = {
  NSPAIR(_ZN7G31x6y6C1Ev),
  NSPAIR(_ZN7G31x6y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x6y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y6[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x6y6[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G31x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x6y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x6y6[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y6[] = {
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y6[] = {
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y6[] = {
  ABISELECT(-24,-16),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y6[] = {
  ABISELECT(-40,-24),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y6[] = {
  {&(_ZTV7G31x6y6[6]),  6,15},
  {&(_tg__ZTV5E31x6__7G31x6y6[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y6[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y6[3]),  3,4},
  {&(_ZTV7G31x6y6[10]),  10,15},
  {&(_ZTV7G31x6y6[14]),  14,15},
};
extern VTBL_ENTRY _ZTI7G31x6y6[];
extern  VTBL_ENTRY _ZTV7G31x6y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y6[];
static VTBL_ENTRY alt_thunk_names195[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn40_N3C313fooEv,_ZThn24_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn24_N3C313fooEv,_ZThn16_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y6 = {  "G31x6y6", // class name
  bases_G31x6y6, 6,
  &(vtc_G31x6y6[0]), // expected_vtbl_contents
  &(vtt_G31x6y6[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G31x6y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y6),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names195,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x6y7  : virtual E31x6 , virtual F0 {
  int ff;
  ~G31x6y7(); // tgen
  G31x6y7(); // tgen
};
//SIG(1 G31x6y7) C1{ VBC2{ BC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x6y7 ::~G31x6y7(){ note_dtor("G31x6y7", this);} // tgen
G31x6y7 ::G31x6y7(){ note_ctor("G31x6y7", this);} // tgen

static void Test_G31x6y7()
{
  extern Class_Descriptor cd_G31x6y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x6y7, buf);
    G31x6y7 *dp, &lv = *(dp=new (buf) G31x6y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x6y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x6y7)");
    check_base_class_offset(lv, (A1*)(C31*)(E31x6*), ABISELECT(32,20), "G31x6y7");
    check_base_class_offset(lv, (B1*)(C31*)(E31x6*), ABISELECT(48,28), "G31x6y7");
    check_base_class_offset(lv, (C31*)(E31x6*), ABISELECT(16,8), "G31x6y7");
    check_base_class_offset(lv, (D0*)(E31x6*), ABISELECT(60,36), "G31x6y7");
    check_base_class_offset(lv, (E31x6*), ABISELECT(16,8), "G31x6y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G31x6y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x6y7.ff");
    test_class_info(&lv, &cd_G31x6y7);
    dp->~G31x6y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x6y7(Test_G31x6y7, "G31x6y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x6y7C1Ev();
extern void _ZN7G31x6y7D1Ev();
Name_Map name_map_G31x6y7[] = {
  NSPAIR(_ZN7G31x6y7C1Ev),
  NSPAIR(_ZN7G31x6y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x6;
extern VTBL_ENTRY _ZTI5E31x6[];
extern  VTBL_ENTRY _ZTV5E31x6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x6[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x6y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 0},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x6,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x6y7[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x6y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x6y7[0]),
  0,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x6y7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-20),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x6y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x6y7[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV5E31x6__7G31x6y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C315E31x6__7G31x6y7[] = {
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C315E31x6__7G31x6y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C315E31x6__7G31x6y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x6__7G31x6y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x6__7G31x6y7[] = {
  ABISELECT(-32,-20),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x6y7[] = {
  {&(_ZTV7G31x6y7[7]),  7,22},
  {&(_ZTV7G31x6y7[13]),  13,22},
  {&(_ZTV7G31x6y7[17]),  17,22},
  {&(_ZTV7G31x6y7[21]),  21,22},
  {&(_tg__ZTV5E31x6__7G31x6y7[5]),  5,6},
  {&(_tg__ZTV3C315E31x6__7G31x6y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C315E31x6__7G31x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C315E31x6__7G31x6y7[3]),  3,4},
  {&(_tg__ZTV2A1__5E31x6__7G31x6y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x6__7G31x6y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x6y7[];
extern  VTBL_ENTRY _ZTV7G31x6y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x6y7[];
static VTBL_ENTRY alt_thunk_names196[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn20_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn12_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x6y7 = {  "G31x6y7", // class name
  bases_G31x6y7, 6,
  &(vtc_G31x6y7[0]), // expected_vtbl_contents
  &(vtt_G31x6y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x6y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x6y7),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x6y7),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names196,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E0x7  : virtual C0 , virtual D0 {
  int fd;
  ~E0x7(); // tgen
  E0x7(); // tgen
};
//SIG(-1 E0x7) C1{ VBC2{ BC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E0x7 ::~E0x7(){ note_dtor("E0x7", this);} // tgen
E0x7 ::E0x7(){ note_ctor("E0x7", this);} // tgen

static void Test_E0x7()
{
  extern Class_Descriptor cd_E0x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(5,7)];
    init_test(&cd_E0x7, buf);
    E0x7 *dp, &lv = *(dp=new (buf) E0x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(32,24), "sizeof(E0x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E0x7)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(12,8), "E0x7");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(16,12), "E0x7");
    check_base_class_offset(lv, (C0*), ABISELECT(12,8), "E0x7");
    check_base_class_offset(lv, (D0*), ABISELECT(24,20), "E0x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E0x7.fd");
    test_class_info(&lv, &cd_E0x7);
    dp->~E0x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE0x7(Test_E0x7, "E0x7", ABISELECT(32,24));

#else // __cplusplus

extern void _ZN4E0x7C1Ev();
extern void _ZN4E0x7D1Ev();
Name_Map name_map_E0x7[] = {
  NSPAIR(_ZN4E0x7C1Ev),
  NSPAIR(_ZN4E0x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E0x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E0x7[];
static  VTBL_ENTRY vtc_E0x7[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
extern VTBL_ENTRY _ZTV4E0x7[];
static  VTT_ENTRY vtt_E0x7[] = {
  {&(_ZTV4E0x7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
Class_Descriptor cd_E0x7 = {  "E0x7", // class name
  bases_E0x7, 4,
  &(vtc_E0x7[0]), // expected_vtbl_contents
  &(vtt_E0x7[0]), // expected_vtt_contents
  ABISELECT(32,24), // object size
  NSPAIRA(_ZTI4E0x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E0x7),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E0x7),1, //virtual table table var
  0, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y0  : E0x7 , F1 {
  int ff;
  ~G0x7y0(); // tgen
  G0x7y0(); // tgen
};
//SIG(1 G0x7y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x7y0 ::~G0x7y0(){ note_dtor("G0x7y0", this);} // tgen
G0x7y0 ::G0x7y0(){ note_ctor("G0x7y0", this);} // tgen

static void Test_G0x7y0()
{
  extern Class_Descriptor cd_G0x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x7y0, buf);
    G0x7y0 *dp, &lv = *(dp=new (buf) G0x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y0)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(32,20), "G0x7y0");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(36,24), "G0x7y0");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(32,20), "G0x7y0");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(44,32), "G0x7y0");
    check_base_class_offset(lv, (E0x7*), 0, "G0x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G0x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G0x7y0.ff");
    test_class_info(&lv, &cd_G0x7y0);
    dp->~G0x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y0(Test_G0x7y0, "G0x7y0", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x7y0C1Ev();
extern void _ZN6G0x7y0D1Ev();
Name_Map name_map_G0x7y0[] = {
  NSPAIR(_ZN6G0x7y0C1Ev),
  NSPAIR(_ZN6G0x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x7y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x7y0[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y0[] = {
  ABISELECT(44,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y0[] = {
  {&(_ZTV6G0x7y0[4]),  4,7},
  {&(_tg__ZTV4E0x7__6G0x7y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y0[];
extern  VTBL_ENTRY _ZTV6G0x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y0[];
Class_Descriptor cd_G0x7y0 = {  "G0x7y0", // class name
  bases_G0x7y0, 6,
  &(vtc_G0x7y0[0]), // expected_vtbl_contents
  &(vtt_G0x7y0[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y0),7, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y0),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y1  : virtual E0x7 , F1 {
  int ff;
  ~G0x7y1(); // tgen
  G0x7y1(); // tgen
};
//SIG(1 G0x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G0x7y1 ::~G0x7y1(){ note_dtor("G0x7y1", this);} // tgen
G0x7y1 ::G0x7y1(){ note_ctor("G0x7y1", this);} // tgen

static void Test_G0x7y1()
{
  extern Class_Descriptor cd_G0x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x7y1, buf);
    G0x7y1 *dp, &lv = *(dp=new (buf) G0x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y1)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,20), "G0x7y1");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,24), "G0x7y1");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(28,20), "G0x7y1");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(40,32), "G0x7y1");
    check_base_class_offset(lv, (E0x7*), ABISELECT(16,12), "G0x7y1");
    check_base_class_offset(lv, (F1*), 0, "G0x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x7y1.ff");
    test_class_info(&lv, &cd_G0x7y1);
    dp->~G0x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y1(Test_G0x7y1, "G0x7y1", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x7y1C1Ev();
extern void _ZN6G0x7y1D1Ev();
Name_Map name_map_G0x7y1[] = {
  NSPAIR(_ZN6G0x7y1C1Ev),
  NSPAIR(_ZN6G0x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x7y1[] = {
  ABISELECT(40,32),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x7y1[0]),
};
extern VTBL_ENTRY _ZTV6G0x7y1[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y1[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y1[] = {
  {&(_ZTV6G0x7y1[5]),  5,10},
  {&(_ZTV6G0x7y1[10]),  10,10},
  {&(_tg__ZTV4E0x7__6G0x7y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y1[];
extern  VTBL_ENTRY _ZTV6G0x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y1[];
Class_Descriptor cd_G0x7y1 = {  "G0x7y1", // class name
  bases_G0x7y1, 6,
  &(vtc_G0x7y1[0]), // expected_vtbl_contents
  &(vtt_G0x7y1[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y1),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y1),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y2  : E0x7 , virtual F1 {
  int ff;
  ~G0x7y2(); // tgen
  G0x7y2(); // tgen
};
//SIG(1 G0x7y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x7y2 ::~G0x7y2(){ note_dtor("G0x7y2", this);} // tgen
G0x7y2 ::G0x7y2(){ note_ctor("G0x7y2", this);} // tgen

static void Test_G0x7y2()
{
  extern Class_Descriptor cd_G0x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x7y2, buf);
    G0x7y2 *dp, &lv = *(dp=new (buf) G0x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y2)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(16,12), "G0x7y2");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(20,16), "G0x7y2");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(16,12), "G0x7y2");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(28,24), "G0x7y2");
    check_base_class_offset(lv, (E0x7*), 0, "G0x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(32,28), "G0x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x7y2.ff");
    test_class_info(&lv, &cd_G0x7y2);
    dp->~G0x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y2(Test_G0x7y2, "G0x7y2", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x7y2C1Ev();
extern void _ZN6G0x7y2D1Ev();
Name_Map name_map_G0x7y2[] = {
  NSPAIR(_ZN6G0x7y2C1Ev),
  NSPAIR(_ZN6G0x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(32,28), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x7y2[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y2[0]),
  0,
  ABISELECT(-32,-28),
  (VTBL_ENTRY)&(_ZTI6G0x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x7y2[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y2[] = {
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y2[] = {
  {&(_ZTV6G0x7y2[5]),  5,9},
  {&(_tg__ZTV4E0x7__6G0x7y2[4]),  4,4},
  {&(_ZTV6G0x7y2[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G0x7y2[];
extern  VTBL_ENTRY _ZTV6G0x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y2[];
Class_Descriptor cd_G0x7y2 = {  "G0x7y2", // class name
  bases_G0x7y2, 6,
  &(vtc_G0x7y2[0]), // expected_vtbl_contents
  &(vtt_G0x7y2[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y2),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y2),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y3  : virtual E0x7 , virtual F1 {
  int ff;
  ~G0x7y3(); // tgen
  G0x7y3(); // tgen
};
//SIG(1 G0x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G0x7y3 ::~G0x7y3(){ note_dtor("G0x7y3", this);} // tgen
G0x7y3 ::G0x7y3(){ note_ctor("G0x7y3", this);} // tgen

static void Test_G0x7y3()
{
  extern Class_Descriptor cd_G0x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G0x7y3, buf);
    G0x7y3 *dp, &lv = *(dp=new (buf) G0x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G0x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y3)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,16), "G0x7y3");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,20), "G0x7y3");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(28,16), "G0x7y3");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(40,28), "G0x7y3");
    check_base_class_offset(lv, (E0x7*), ABISELECT(16,8), "G0x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(48,32), "G0x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x7y3.ff");
    test_class_info(&lv, &cd_G0x7y3);
    dp->~G0x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y3(Test_G0x7y3, "G0x7y3", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G0x7y3C1Ev();
extern void _ZN6G0x7y3D1Ev();
Name_Map name_map_G0x7y3[] = {
  NSPAIR(_ZN6G0x7y3C1Ev),
  NSPAIR(_ZN6G0x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G0x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(48,32), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G0x7y3[] = {
  ABISELECT(48,32),
  ABISELECT(40,28),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y3[0]),
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x7y3[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G0x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G0x7y3[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y3[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y3[] = {
  {&(_ZTV6G0x7y3[6]),  6,14},
  {&(_ZTV6G0x7y3[10]),  10,14},
  {&(_ZTV6G0x7y3[13]),  13,14},
  {&(_tg__ZTV4E0x7__6G0x7y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y3[];
extern  VTBL_ENTRY _ZTV6G0x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y3[];
Class_Descriptor cd_G0x7y3 = {  "G0x7y3", // class name
  bases_G0x7y3, 6,
  &(vtc_G0x7y3[0]), // expected_vtbl_contents
  &(vtt_G0x7y3[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G0x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y3),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y3),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y4  : E0x7 , F0 {
  int ff;
  ~G0x7y4(); // tgen
  G0x7y4(); // tgen
};
//SIG(1 G0x7y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G0x7y4 ::~G0x7y4(){ note_dtor("G0x7y4", this);} // tgen
G0x7y4 ::G0x7y4(){ note_ctor("G0x7y4", this);} // tgen

static void Test_G0x7y4()
{
  extern Class_Descriptor cd_G0x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x7y4, buf);
    G0x7y4 *dp, &lv = *(dp=new (buf) G0x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y4)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(20,16), "G0x7y4");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(24,20), "G0x7y4");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(20,16), "G0x7y4");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(32,28), "G0x7y4");
    check_base_class_offset(lv, (E0x7*), 0, "G0x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G0x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G0x7y4.ff");
    test_class_info(&lv, &cd_G0x7y4);
    dp->~G0x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y4(Test_G0x7y4, "G0x7y4", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x7y4C1Ev();
extern void _ZN6G0x7y4D1Ev();
Name_Map name_map_G0x7y4[] = {
  NSPAIR(_ZN6G0x7y4C1Ev),
  NSPAIR(_ZN6G0x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(24,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y4[];
static  VTBL_ENTRY vtc_G0x7y4[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y4[0]),
};
extern VTBL_ENTRY _ZTV6G0x7y4[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y4[] = {
  ABISELECT(32,28),
  ABISELECT(20,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y4[] = {
  {&(_ZTV6G0x7y4[4]),  4,4},
  {&(_tg__ZTV4E0x7__6G0x7y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y4[];
extern  VTBL_ENTRY _ZTV6G0x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y4[];
Class_Descriptor cd_G0x7y4 = {  "G0x7y4", // class name
  bases_G0x7y4, 6,
  &(vtc_G0x7y4[0]), // expected_vtbl_contents
  &(vtt_G0x7y4[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y4),4, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y4),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y5  : virtual E0x7 , F0 {
  int ff;
  ~G0x7y5(); // tgen
  G0x7y5(); // tgen
};
//SIG(1 G0x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G0x7y5 ::~G0x7y5(){ note_dtor("G0x7y5", this);} // tgen
G0x7y5 ::G0x7y5(){ note_ctor("G0x7y5", this);} // tgen

static void Test_G0x7y5()
{
  extern Class_Descriptor cd_G0x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x7y5, buf);
    G0x7y5 *dp, &lv = *(dp=new (buf) G0x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y5)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,20), "G0x7y5");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,24), "G0x7y5");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(28,20), "G0x7y5");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(40,32), "G0x7y5");
    check_base_class_offset(lv, (E0x7*), ABISELECT(16,12), "G0x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G0x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x7y5.ff");
    test_class_info(&lv, &cd_G0x7y5);
    dp->~G0x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y5(Test_G0x7y5, "G0x7y5", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x7y5C1Ev();
extern void _ZN6G0x7y5D1Ev();
Name_Map name_map_G0x7y5[] = {
  NSPAIR(_ZN6G0x7y5C1Ev),
  NSPAIR(_ZN6G0x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y5[];
static  VTBL_ENTRY vtc_G0x7y5[] = {
  ABISELECT(40,32),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y5[0]),
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G0x7y5[0]),
};
extern VTBL_ENTRY _ZTV6G0x7y5[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y5[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y5[] = {
  {&(_ZTV6G0x7y5[5]),  5,9},
  {&(_ZTV6G0x7y5[9]),  9,9},
  {&(_tg__ZTV4E0x7__6G0x7y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y5[];
extern  VTBL_ENTRY _ZTV6G0x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y5[];
Class_Descriptor cd_G0x7y5 = {  "G0x7y5", // class name
  bases_G0x7y5, 6,
  &(vtc_G0x7y5[0]), // expected_vtbl_contents
  &(vtt_G0x7y5[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y5),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y5),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y6  : E0x7 , virtual F0 {
  int ff;
  ~G0x7y6(); // tgen
  G0x7y6(); // tgen
};
//SIG(1 G0x7y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x7y6 ::~G0x7y6(){ note_dtor("G0x7y6", this);} // tgen
G0x7y6 ::G0x7y6(){ note_ctor("G0x7y6", this);} // tgen

static void Test_G0x7y6()
{
  extern Class_Descriptor cd_G0x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,9)];
    init_test(&cd_G0x7y6, buf);
    G0x7y6 *dp, &lv = *(dp=new (buf) G0x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,32), "sizeof(G0x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y6)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(16,12), "G0x7y6");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(20,16), "G0x7y6");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(16,12), "G0x7y6");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(28,24), "G0x7y6");
    check_base_class_offset(lv, (E0x7*), 0, "G0x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(32,28), "G0x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G0x7y6.ff");
    test_class_info(&lv, &cd_G0x7y6);
    dp->~G0x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y6(Test_G0x7y6, "G0x7y6", ABISELECT(40,32));

#else // __cplusplus

extern void _ZN6G0x7y6C1Ev();
extern void _ZN6G0x7y6D1Ev();
Name_Map name_map_G0x7y6[] = {
  NSPAIR(_ZN6G0x7y6C1Ev),
  NSPAIR(_ZN6G0x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(20,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(28,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(32,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y6[];
static  VTBL_ENTRY vtc_G0x7y6[] = {
  ABISELECT(32,28),
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y6[0]),
};
extern VTBL_ENTRY _ZTV6G0x7y6[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y6[] = {
  ABISELECT(28,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y6[] = {
  {&(_ZTV6G0x7y6[5]),  5,5},
  {&(_tg__ZTV4E0x7__6G0x7y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y6[];
extern  VTBL_ENTRY _ZTV6G0x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y6[];
Class_Descriptor cd_G0x7y6 = {  "G0x7y6", // class name
  bases_G0x7y6, 6,
  &(vtc_G0x7y6[0]), // expected_vtbl_contents
  &(vtt_G0x7y6[0]), // expected_vtt_contents
  ABISELECT(40,32), // object size
  NSPAIRA(_ZTI6G0x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y6),5, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y6),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G0x7y7  : virtual E0x7 , virtual F0 {
  int ff;
  ~G0x7y7(); // tgen
  G0x7y7(); // tgen
};
//SIG(1 G0x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G0x7y7 ::~G0x7y7(){ note_dtor("G0x7y7", this);} // tgen
G0x7y7 ::G0x7y7(){ note_ctor("G0x7y7", this);} // tgen

static void Test_G0x7y7()
{
  extern Class_Descriptor cd_G0x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G0x7y7, buf);
    G0x7y7 *dp, &lv = *(dp=new (buf) G0x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G0x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G0x7y7)");
    check_base_class_offset(lv, (A0*)(C0*), ABISELECT(28,16), "G0x7y7");
    check_base_class_offset(lv, (B0*)(C0*), ABISELECT(32,20), "G0x7y7");
    check_base_class_offset(lv, (C0*)(E0x7*), ABISELECT(28,16), "G0x7y7");
    check_base_class_offset(lv, (D0*)(E0x7*), ABISELECT(40,28), "G0x7y7");
    check_base_class_offset(lv, (E0x7*), ABISELECT(16,8), "G0x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(44,32), "G0x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G0x7y7.ff");
    test_class_info(&lv, &cd_G0x7y7);
    dp->~G0x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG0x7y7(Test_G0x7y7, "G0x7y7", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G0x7y7C1Ev();
extern void _ZN6G0x7y7D1Ev();
Name_Map name_map_G0x7y7[] = {
  NSPAIR(_ZN6G0x7y7C1Ev),
  NSPAIR(_ZN6G0x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C0;
extern VTBL_ENTRY _ZTI2C0[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E0x7;
extern VTBL_ENTRY _ZTI4E0x7[];
extern  VTBL_ENTRY _ZTV4E0x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E0x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G0x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E0x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G0x7y7[];
static  VTBL_ENTRY vtc_G0x7y7[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G0x7y7[0]),
  ABISELECT(24,20),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G0x7y7[0]),
};
extern VTBL_ENTRY _ZTV6G0x7y7[];
static  VTBL_ENTRY _tg__ZTV4E0x7__6G0x7y7[] = {
  ABISELECT(24,20),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E0x7[0]),
};
static  VTT_ENTRY vtt_G0x7y7[] = {
  {&(_ZTV6G0x7y7[6]),  6,10},
  {&(_ZTV6G0x7y7[10]),  10,10},
  {&(_tg__ZTV4E0x7__6G0x7y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI6G0x7y7[];
extern  VTBL_ENTRY _ZTV6G0x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G0x7y7[];
Class_Descriptor cd_G0x7y7 = {  "G0x7y7", // class name
  bases_G0x7y7, 6,
  &(vtc_G0x7y7[0]), // expected_vtbl_contents
  &(vtt_G0x7y7[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G0x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G0x7y7),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G0x7y7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E1x7  : virtual C1 , virtual D0 {
  int fd;
  ~E1x7(); // tgen
  E1x7(); // tgen
};
//SIG(-1 E1x7) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E1x7 ::~E1x7(){ note_dtor("E1x7", this);} // tgen
E1x7 ::E1x7(){ note_ctor("E1x7", this);} // tgen

static void Test_E1x7()
{
  extern Class_Descriptor cd_E1x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E1x7, buf);
    E1x7 *dp, &lv = *(dp=new (buf) E1x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E1x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E1x7)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,8), "E1x7");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,16), "E1x7");
    check_base_class_offset(lv, (C1*), ABISELECT(16,8), "E1x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E1x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E1x7.fd");
    test_class_info(&lv, &cd_E1x7);
    dp->~E1x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE1x7(Test_E1x7, "E1x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E1x7C1Ev();
extern void _ZN4E1x7D1Ev();
Name_Map name_map_E1x7[] = {
  NSPAIR(_ZN4E1x7C1Ev),
  NSPAIR(_ZN4E1x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E1x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E1x7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E1x7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E1x7[];
static  VTT_ENTRY vtt_E1x7[] = {
  {&(_ZTV4E1x7[4]),  4,8},
  {&(_ZTV4E1x7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
Class_Descriptor cd_E1x7 = {  "E1x7", // class name
  bases_E1x7, 4,
  &(vtc_E1x7[0]), // expected_vtbl_contents
  &(vtt_E1x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E1x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E1x7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E1x7),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y0  : E1x7 , F1 {
  int ff;
  ~G1x7y0(); // tgen
  G1x7y0(); // tgen
};
//SIG(1 G1x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x7y0 ::~G1x7y0(){ note_dtor("G1x7y0", this);} // tgen
G1x7y0 ::G1x7y0(){ note_ctor("G1x7y0", this);} // tgen

static void Test_G1x7y0()
{
  extern Class_Descriptor cd_G1x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x7y0, buf);
    G1x7y0 *dp, &lv = *(dp=new (buf) G1x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y0)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x7y0");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x7y0");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(32,20), "G1x7y0");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(52,36), "G1x7y0");
    check_base_class_offset(lv, (E1x7*), 0, "G1x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G1x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G1x7y0.ff");
    test_class_info(&lv, &cd_G1x7y0);
    dp->~G1x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y0(Test_G1x7y0, "G1x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x7y0C1Ev();
extern void _ZN6G1x7y0D1Ev();
Name_Map name_map_G1x7y0[] = {
  NSPAIR(_ZN6G1x7y0C1Ev),
  NSPAIR(_ZN6G1x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G1x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y0[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y0[] = {
  {&(_ZTV6G1x7y0[4]),  4,11},
  {&(_tg__ZTV4E1x7__6G1x7y0[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y0[3]),  3,4},
  {&(_ZTV6G1x7y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G1x7y0[];
extern  VTBL_ENTRY _ZTV6G1x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y0[];
Class_Descriptor cd_G1x7y0 = {  "G1x7y0", // class name
  bases_G1x7y0, 6,
  &(vtc_G1x7y0[0]), // expected_vtbl_contents
  &(vtt_G1x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y1  : virtual E1x7 , F1 {
  int ff;
  ~G1x7y1(); // tgen
  G1x7y1(); // tgen
};
//SIG(1 G1x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G1x7y1 ::~G1x7y1(){ note_dtor("G1x7y1", this);} // tgen
G1x7y1 ::G1x7y1(){ note_ctor("G1x7y1", this);} // tgen

static void Test_G1x7y1()
{
  extern Class_Descriptor cd_G1x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x7y1, buf);
    G1x7y1 *dp, &lv = *(dp=new (buf) G1x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y1)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x7y1");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x7y1");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(32,20), "G1x7y1");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(52,36), "G1x7y1");
    check_base_class_offset(lv, (E1x7*), ABISELECT(16,12), "G1x7y1");
    check_base_class_offset(lv, (F1*), 0, "G1x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x7y1.ff");
    test_class_info(&lv, &cd_G1x7y1);
    dp->~G1x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y1(Test_G1x7y1, "G1x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x7y1C1Ev();
extern void _ZN6G1x7y1D1Ev();
Name_Map name_map_G1x7y1[] = {
  NSPAIR(_ZN6G1x7y1C1Ev),
  NSPAIR(_ZN6G1x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G1x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y1[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y1[] = {
  {&(_ZTV6G1x7y1[5]),  5,14},
  {&(_ZTV6G1x7y1[10]),  10,14},
  {&(_ZTV6G1x7y1[13]),  13,14},
  {&(_tg__ZTV4E1x7__6G1x7y1[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x7y1[];
extern  VTBL_ENTRY _ZTV6G1x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y1[];
Class_Descriptor cd_G1x7y1 = {  "G1x7y1", // class name
  bases_G1x7y1, 6,
  &(vtc_G1x7y1[0]), // expected_vtbl_contents
  &(vtt_G1x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y2  : E1x7 , virtual F1 {
  int ff;
  ~G1x7y2(); // tgen
  G1x7y2(); // tgen
};
//SIG(1 G1x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x7y2 ::~G1x7y2(){ note_dtor("G1x7y2", this);} // tgen
G1x7y2 ::G1x7y2(){ note_ctor("G1x7y2", this);} // tgen

static void Test_G1x7y2()
{
  extern Class_Descriptor cd_G1x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x7y2, buf);
    G1x7y2 *dp, &lv = *(dp=new (buf) G1x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y2)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,12), "G1x7y2");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,20), "G1x7y2");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(16,12), "G1x7y2");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(36,28), "G1x7y2");
    check_base_class_offset(lv, (E1x7*), 0, "G1x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G1x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x7y2.ff");
    test_class_info(&lv, &cd_G1x7y2);
    dp->~G1x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y2(Test_G1x7y2, "G1x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x7y2C1Ev();
extern void _ZN6G1x7y2D1Ev();
Name_Map name_map_G1x7y2[] = {
  NSPAIR(_ZN6G1x7y2C1Ev),
  NSPAIR(_ZN6G1x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G1x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y2[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y2[] = {
  {&(_ZTV6G1x7y2[5]),  5,13},
  {&(_tg__ZTV4E1x7__6G1x7y2[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y2[3]),  3,4},
  {&(_ZTV6G1x7y2[8]),  8,13},
  {&(_ZTV6G1x7y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6G1x7y2[];
extern  VTBL_ENTRY _ZTV6G1x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y2[];
Class_Descriptor cd_G1x7y2 = {  "G1x7y2", // class name
  bases_G1x7y2, 6,
  &(vtc_G1x7y2[0]), // expected_vtbl_contents
  &(vtt_G1x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y3  : virtual E1x7 , virtual F1 {
  int ff;
  ~G1x7y3(); // tgen
  G1x7y3(); // tgen
};
//SIG(1 G1x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G1x7y3 ::~G1x7y3(){ note_dtor("G1x7y3", this);} // tgen
G1x7y3 ::G1x7y3(){ note_ctor("G1x7y3", this);} // tgen

static void Test_G1x7y3()
{
  extern Class_Descriptor cd_G1x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G1x7y3, buf);
    G1x7y3 *dp, &lv = *(dp=new (buf) G1x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G1x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y3)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,16), "G1x7y3");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,24), "G1x7y3");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(32,16), "G1x7y3");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(52,32), "G1x7y3");
    check_base_class_offset(lv, (E1x7*), ABISELECT(16,8), "G1x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G1x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x7y3.ff");
    test_class_info(&lv, &cd_G1x7y3);
    dp->~G1x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y3(Test_G1x7y3, "G1x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G1x7y3C1Ev();
extern void _ZN6G1x7y3D1Ev();
Name_Map name_map_G1x7y3[] = {
  NSPAIR(_ZN6G1x7y3C1Ev),
  NSPAIR(_ZN6G1x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G1x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G1x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G1x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G1x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y3[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y3[] = {
  {&(_ZTV6G1x7y3[6]),  6,18},
  {&(_ZTV6G1x7y3[10]),  10,18},
  {&(_ZTV6G1x7y3[13]),  13,18},
  {&(_ZTV6G1x7y3[17]),  17,18},
  {&(_tg__ZTV4E1x7__6G1x7y3[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x7y3[];
extern  VTBL_ENTRY _ZTV6G1x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y3[];
Class_Descriptor cd_G1x7y3 = {  "G1x7y3", // class name
  bases_G1x7y3, 6,
  &(vtc_G1x7y3[0]), // expected_vtbl_contents
  &(vtt_G1x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G1x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y4  : E1x7 , F0 {
  int ff;
  ~G1x7y4(); // tgen
  G1x7y4(); // tgen
};
//SIG(1 G1x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G1x7y4 ::~G1x7y4(){ note_dtor("G1x7y4", this);} // tgen
G1x7y4 ::G1x7y4(){ note_ctor("G1x7y4", this);} // tgen

static void Test_G1x7y4()
{
  extern Class_Descriptor cd_G1x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x7y4, buf);
    G1x7y4 *dp, &lv = *(dp=new (buf) G1x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y4)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(24,16), "G1x7y4");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(36,24), "G1x7y4");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(24,16), "G1x7y4");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(44,32), "G1x7y4");
    check_base_class_offset(lv, (E1x7*), 0, "G1x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G1x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G1x7y4.ff");
    test_class_info(&lv, &cd_G1x7y4);
    dp->~G1x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y4(Test_G1x7y4, "G1x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x7y4C1Ev();
extern void _ZN6G1x7y4D1Ev();
Name_Map name_map_G1x7y4[] = {
  NSPAIR(_ZN6G1x7y4C1Ev),
  NSPAIR(_ZN6G1x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G1x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y4[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y4[] = {
  {&(_ZTV6G1x7y4[4]),  4,8},
  {&(_tg__ZTV4E1x7__6G1x7y4[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y4[3]),  3,4},
  {&(_ZTV6G1x7y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G1x7y4[];
extern  VTBL_ENTRY _ZTV6G1x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y4[];
Class_Descriptor cd_G1x7y4 = {  "G1x7y4", // class name
  bases_G1x7y4, 6,
  &(vtc_G1x7y4[0]), // expected_vtbl_contents
  &(vtt_G1x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y5  : virtual E1x7 , F0 {
  int ff;
  ~G1x7y5(); // tgen
  G1x7y5(); // tgen
};
//SIG(1 G1x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G1x7y5 ::~G1x7y5(){ note_dtor("G1x7y5", this);} // tgen
G1x7y5 ::G1x7y5(){ note_ctor("G1x7y5", this);} // tgen

static void Test_G1x7y5()
{
  extern Class_Descriptor cd_G1x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G1x7y5, buf);
    G1x7y5 *dp, &lv = *(dp=new (buf) G1x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G1x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y5)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,20), "G1x7y5");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,28), "G1x7y5");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(32,20), "G1x7y5");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(52,36), "G1x7y5");
    check_base_class_offset(lv, (E1x7*), ABISELECT(16,12), "G1x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G1x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x7y5.ff");
    test_class_info(&lv, &cd_G1x7y5);
    dp->~G1x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y5(Test_G1x7y5, "G1x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G1x7y5C1Ev();
extern void _ZN6G1x7y5D1Ev();
Name_Map name_map_G1x7y5[] = {
  NSPAIR(_ZN6G1x7y5C1Ev),
  NSPAIR(_ZN6G1x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G1x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y5[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y5[] = {
  {&(_ZTV6G1x7y5[5]),  5,13},
  {&(_ZTV6G1x7y5[9]),  9,13},
  {&(_ZTV6G1x7y5[12]),  12,13},
  {&(_tg__ZTV4E1x7__6G1x7y5[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x7y5[];
extern  VTBL_ENTRY _ZTV6G1x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y5[];
Class_Descriptor cd_G1x7y5 = {  "G1x7y5", // class name
  bases_G1x7y5, 6,
  &(vtc_G1x7y5[0]), // expected_vtbl_contents
  &(vtt_G1x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G1x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y6  : E1x7 , virtual F0 {
  int ff;
  ~G1x7y6(); // tgen
  G1x7y6(); // tgen
};
//SIG(1 G1x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x7y6 ::~G1x7y6(){ note_dtor("G1x7y6", this);} // tgen
G1x7y6 ::G1x7y6(){ note_ctor("G1x7y6", this);} // tgen

static void Test_G1x7y6()
{
  extern Class_Descriptor cd_G1x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G1x7y6, buf);
    G1x7y6 *dp, &lv = *(dp=new (buf) G1x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G1x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y6)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(16,12), "G1x7y6");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(28,20), "G1x7y6");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(16,12), "G1x7y6");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(36,28), "G1x7y6");
    check_base_class_offset(lv, (E1x7*), 0, "G1x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G1x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G1x7y6.ff");
    test_class_info(&lv, &cd_G1x7y6);
    dp->~G1x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y6(Test_G1x7y6, "G1x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G1x7y6C1Ev();
extern void _ZN6G1x7y6D1Ev();
Name_Map name_map_G1x7y6[] = {
  NSPAIR(_ZN6G1x7y6C1Ev),
  NSPAIR(_ZN6G1x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G1x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y6[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y6[] = {
  {&(_ZTV6G1x7y6[5]),  5,9},
  {&(_tg__ZTV4E1x7__6G1x7y6[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y6[3]),  3,4},
  {&(_ZTV6G1x7y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G1x7y6[];
extern  VTBL_ENTRY _ZTV6G1x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y6[];
Class_Descriptor cd_G1x7y6 = {  "G1x7y6", // class name
  bases_G1x7y6, 6,
  &(vtc_G1x7y6[0]), // expected_vtbl_contents
  &(vtt_G1x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G1x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G1x7y7  : virtual E1x7 , virtual F0 {
  int ff;
  ~G1x7y7(); // tgen
  G1x7y7(); // tgen
};
//SIG(1 G1x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G1x7y7 ::~G1x7y7(){ note_dtor("G1x7y7", this);} // tgen
G1x7y7 ::G1x7y7(){ note_ctor("G1x7y7", this);} // tgen

static void Test_G1x7y7()
{
  extern Class_Descriptor cd_G1x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G1x7y7, buf);
    G1x7y7 *dp, &lv = *(dp=new (buf) G1x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G1x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G1x7y7)");
    check_base_class_offset(lv, (A1*)(C1*), ABISELECT(32,16), "G1x7y7");
    check_base_class_offset(lv, (B0*)(C1*), ABISELECT(44,24), "G1x7y7");
    check_base_class_offset(lv, (C1*)(E1x7*), ABISELECT(32,16), "G1x7y7");
    check_base_class_offset(lv, (D0*)(E1x7*), ABISELECT(52,32), "G1x7y7");
    check_base_class_offset(lv, (E1x7*), ABISELECT(16,8), "G1x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G1x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G1x7y7.ff");
    test_class_info(&lv, &cd_G1x7y7);
    dp->~G1x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG1x7y7(Test_G1x7y7, "G1x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G1x7y7C1Ev();
extern void _ZN6G1x7y7D1Ev();
Name_Map name_map_G1x7y7[] = {
  NSPAIR(_ZN6G1x7y7C1Ev),
  NSPAIR(_ZN6G1x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C1;
extern VTBL_ENTRY _ZTI2C1[];
extern  VTBL_ENTRY _ZTV2C1[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E1x7;
extern VTBL_ENTRY _ZTI4E1x7[];
extern  VTBL_ENTRY _ZTV4E1x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E1x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G1x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E1x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G1x7y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G1x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G1x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G1x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G1x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G1x7y7[];
static  VTBL_ENTRY _tg__ZTV4E1x7__6G1x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C1__4E1x7__6G1x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E1x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G1x7y7[] = {
  {&(_ZTV6G1x7y7[6]),  6,14},
  {&(_ZTV6G1x7y7[10]),  10,14},
  {&(_ZTV6G1x7y7[13]),  13,14},
  {&(_tg__ZTV4E1x7__6G1x7y7[4]),  4,4},
  {&(_tg__ZTV2A12C1__4E1x7__6G1x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G1x7y7[];
extern  VTBL_ENTRY _ZTV6G1x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G1x7y7[];
Class_Descriptor cd_G1x7y7 = {  "G1x7y7", // class name
  bases_G1x7y7, 6,
  &(vtc_G1x7y7[0]), // expected_vtbl_contents
  &(vtt_G1x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G1x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G1x7y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G1x7y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E2x7  : virtual C2 , virtual D0 {
  int fd;
  ~E2x7(); // tgen
  E2x7(); // tgen
};
//SIG(-1 E2x7) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E2x7 ::~E2x7(){ note_dtor("E2x7", this);} // tgen
E2x7 ::E2x7(){ note_ctor("E2x7", this);} // tgen

static void Test_E2x7()
{
  extern Class_Descriptor cd_E2x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E2x7, buf);
    E2x7 *dp, &lv = *(dp=new (buf) E2x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E2x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E2x7)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,20), "E2x7");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,12), "E2x7");
    check_base_class_offset(lv, (C2*), ABISELECT(16,8), "E2x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E2x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E2x7.fd");
    test_class_info(&lv, &cd_E2x7);
    dp->~E2x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE2x7(Test_E2x7, "E2x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E2x7C1Ev();
extern void _ZN4E2x7D1Ev();
Name_Map name_map_E2x7[] = {
  NSPAIR(_ZN4E2x7C1Ev),
  NSPAIR(_ZN4E2x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E2x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E2x7[];
static  VTBL_ENTRY vtc_E2x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
extern VTBL_ENTRY _ZTV4E2x7[];
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_E2x7[] = {
  {&(_ZTV4E2x7[5]),  5,8},
  {&(_ZTV4E2x7[8]),  8,8},
  {&(_tg__ZTV2C2__4E2x7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
Class_Descriptor cd_E2x7 = {  "E2x7", // class name
  bases_E2x7, 4,
  &(vtc_E2x7[0]), // expected_vtbl_contents
  &(vtt_E2x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E2x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E2x7),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E2x7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y0  : E2x7 , F1 {
  int ff;
  ~G2x7y0(); // tgen
  G2x7y0(); // tgen
};
//SIG(1 G2x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x7y0 ::~G2x7y0(){ note_dtor("G2x7y0", this);} // tgen
G2x7y0 ::G2x7y0(){ note_ctor("G2x7y0", this);} // tgen

static void Test_G2x7y0()
{
  extern Class_Descriptor cd_G2x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x7y0, buf);
    G2x7y0 *dp, &lv = *(dp=new (buf) G2x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y0)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x7y0");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x7y0");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(32,20), "G2x7y0");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(52,36), "G2x7y0");
    check_base_class_offset(lv, (E2x7*), 0, "G2x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G2x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G2x7y0.ff");
    test_class_info(&lv, &cd_G2x7y0);
    dp->~G2x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y0(Test_G2x7y0, "G2x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x7y0C1Ev();
extern void _ZN6G2x7y0D1Ev();
Name_Map name_map_G2x7y0[] = {
  NSPAIR(_ZN6G2x7y0C1Ev),
  NSPAIR(_ZN6G2x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G2x7y0[0]),
};
extern VTBL_ENTRY _ZTV6G2x7y0[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y0[] = {
  {&(_ZTV6G2x7y0[5]),  5,11},
  {&(_tg__ZTV4E2x7__6G2x7y0[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y0[3]),  3,3},
  {&(_ZTV6G2x7y0[11]),  11,11},
  {&(_tg__ZTV2C2__6G2x7y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y0[];
extern  VTBL_ENTRY _ZTV6G2x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y0[];
Class_Descriptor cd_G2x7y0 = {  "G2x7y0", // class name
  bases_G2x7y0, 6,
  &(vtc_G2x7y0[0]), // expected_vtbl_contents
  &(vtt_G2x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y0),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y1  : virtual E2x7 , F1 {
  int ff;
  ~G2x7y1(); // tgen
  G2x7y1(); // tgen
};
//SIG(1 G2x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G2x7y1 ::~G2x7y1(){ note_dtor("G2x7y1", this);} // tgen
G2x7y1 ::G2x7y1(){ note_ctor("G2x7y1", this);} // tgen

static void Test_G2x7y1()
{
  extern Class_Descriptor cd_G2x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x7y1, buf);
    G2x7y1 *dp, &lv = *(dp=new (buf) G2x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y1)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x7y1");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x7y1");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(32,20), "G2x7y1");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(52,36), "G2x7y1");
    check_base_class_offset(lv, (E2x7*), ABISELECT(16,12), "G2x7y1");
    check_base_class_offset(lv, (F1*), 0, "G2x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x7y1.ff");
    test_class_info(&lv, &cd_G2x7y1);
    dp->~G2x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y1(Test_G2x7y1, "G2x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x7y1C1Ev();
extern void _ZN6G2x7y1D1Ev();
Name_Map name_map_G2x7y1[] = {
  NSPAIR(_ZN6G2x7y1C1Ev),
  NSPAIR(_ZN6G2x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x7y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G2x7y1[0]),
};
extern VTBL_ENTRY _ZTV6G2x7y1[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y1[] = {
  {&(_ZTV6G2x7y1[6]),  6,15},
  {&(_ZTV6G2x7y1[12]),  12,15},
  {&(_ZTV6G2x7y1[15]),  15,15},
  {&(_tg__ZTV4E2x7__6G2x7y1[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y1[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x7y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y1[];
extern  VTBL_ENTRY _ZTV6G2x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y1[];
Class_Descriptor cd_G2x7y1 = {  "G2x7y1", // class name
  bases_G2x7y1, 6,
  &(vtc_G2x7y1[0]), // expected_vtbl_contents
  &(vtt_G2x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y1),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y2  : E2x7 , virtual F1 {
  int ff;
  ~G2x7y2(); // tgen
  G2x7y2(); // tgen
};
//SIG(1 G2x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x7y2 ::~G2x7y2(){ note_dtor("G2x7y2", this);} // tgen
G2x7y2 ::G2x7y2(){ note_ctor("G2x7y2", this);} // tgen

static void Test_G2x7y2()
{
  extern Class_Descriptor cd_G2x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x7y2, buf);
    G2x7y2 *dp, &lv = *(dp=new (buf) G2x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y2)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,24), "G2x7y2");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,16), "G2x7y2");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(16,12), "G2x7y2");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(36,28), "G2x7y2");
    check_base_class_offset(lv, (E2x7*), 0, "G2x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G2x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x7y2.ff");
    test_class_info(&lv, &cd_G2x7y2);
    dp->~G2x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y2(Test_G2x7y2, "G2x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x7y2C1Ev();
extern void _ZN6G2x7y2D1Ev();
Name_Map name_map_G2x7y2[] = {
  NSPAIR(_ZN6G2x7y2C1Ev),
  NSPAIR(_ZN6G2x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y2[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x7y2[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G2x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x7y2[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y2[] = {
  {&(_ZTV6G2x7y2[6]),  6,13},
  {&(_tg__ZTV4E2x7__6G2x7y2[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y2[3]),  3,3},
  {&(_ZTV6G2x7y2[9]),  9,13},
  {&(_ZTV6G2x7y2[12]),  12,13},
  {&(_tg__ZTV2C2__6G2x7y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y2[];
extern  VTBL_ENTRY _ZTV6G2x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y2[];
Class_Descriptor cd_G2x7y2 = {  "G2x7y2", // class name
  bases_G2x7y2, 6,
  &(vtc_G2x7y2[0]), // expected_vtbl_contents
  &(vtt_G2x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y2),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y3  : virtual E2x7 , virtual F1 {
  int ff;
  ~G2x7y3(); // tgen
  G2x7y3(); // tgen
};
//SIG(1 G2x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G2x7y3 ::~G2x7y3(){ note_dtor("G2x7y3", this);} // tgen
G2x7y3 ::G2x7y3(){ note_ctor("G2x7y3", this);} // tgen

static void Test_G2x7y3()
{
  extern Class_Descriptor cd_G2x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G2x7y3, buf);
    G2x7y3 *dp, &lv = *(dp=new (buf) G2x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G2x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y3)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,28), "G2x7y3");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,20), "G2x7y3");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(32,16), "G2x7y3");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(52,32), "G2x7y3");
    check_base_class_offset(lv, (E2x7*), ABISELECT(16,8), "G2x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G2x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x7y3.ff");
    test_class_info(&lv, &cd_G2x7y3);
    dp->~G2x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y3(Test_G2x7y3, "G2x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G2x7y3C1Ev();
extern void _ZN6G2x7y3D1Ev();
Name_Map name_map_G2x7y3[] = {
  NSPAIR(_ZN6G2x7y3C1Ev),
  NSPAIR(_ZN6G2x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G2x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G2x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x7y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G2x7y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G2x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G2x7y3[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y3[] = {
  {&(_ZTV6G2x7y3[7]),  7,19},
  {&(_ZTV6G2x7y3[12]),  12,19},
  {&(_ZTV6G2x7y3[15]),  15,19},
  {&(_ZTV6G2x7y3[18]),  18,19},
  {&(_tg__ZTV4E2x7__6G2x7y3[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y3[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x7y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y3[];
extern  VTBL_ENTRY _ZTV6G2x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y3[];
Class_Descriptor cd_G2x7y3 = {  "G2x7y3", // class name
  bases_G2x7y3, 6,
  &(vtc_G2x7y3[0]), // expected_vtbl_contents
  &(vtt_G2x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G2x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y3),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y4  : E2x7 , F0 {
  int ff;
  ~G2x7y4(); // tgen
  G2x7y4(); // tgen
};
//SIG(1 G2x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G2x7y4 ::~G2x7y4(){ note_dtor("G2x7y4", this);} // tgen
G2x7y4 ::G2x7y4(){ note_ctor("G2x7y4", this);} // tgen

static void Test_G2x7y4()
{
  extern Class_Descriptor cd_G2x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x7y4, buf);
    G2x7y4 *dp, &lv = *(dp=new (buf) G2x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y4)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(40,28), "G2x7y4");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(32,20), "G2x7y4");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(24,16), "G2x7y4");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(44,32), "G2x7y4");
    check_base_class_offset(lv, (E2x7*), 0, "G2x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G2x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G2x7y4.ff");
    test_class_info(&lv, &cd_G2x7y4);
    dp->~G2x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y4(Test_G2x7y4, "G2x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x7y4C1Ev();
extern void _ZN6G2x7y4D1Ev();
Name_Map name_map_G2x7y4[] = {
  NSPAIR(_ZN6G2x7y4C1Ev),
  NSPAIR(_ZN6G2x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y4[];
static  VTBL_ENTRY vtc_G2x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G2x7y4[0]),
};
extern VTBL_ENTRY _ZTV6G2x7y4[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y4[] = {
  {&(_ZTV6G2x7y4[5]),  5,8},
  {&(_tg__ZTV4E2x7__6G2x7y4[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y4[3]),  3,3},
  {&(_ZTV6G2x7y4[8]),  8,8},
  {&(_tg__ZTV2C2__6G2x7y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y4[];
extern  VTBL_ENTRY _ZTV6G2x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y4[];
Class_Descriptor cd_G2x7y4 = {  "G2x7y4", // class name
  bases_G2x7y4, 6,
  &(vtc_G2x7y4[0]), // expected_vtbl_contents
  &(vtt_G2x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y4),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y5  : virtual E2x7 , F0 {
  int ff;
  ~G2x7y5(); // tgen
  G2x7y5(); // tgen
};
//SIG(1 G2x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G2x7y5 ::~G2x7y5(){ note_dtor("G2x7y5", this);} // tgen
G2x7y5 ::G2x7y5(){ note_ctor("G2x7y5", this);} // tgen

static void Test_G2x7y5()
{
  extern Class_Descriptor cd_G2x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G2x7y5, buf);
    G2x7y5 *dp, &lv = *(dp=new (buf) G2x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G2x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y5)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,32), "G2x7y5");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,24), "G2x7y5");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(32,20), "G2x7y5");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(52,36), "G2x7y5");
    check_base_class_offset(lv, (E2x7*), ABISELECT(16,12), "G2x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G2x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x7y5.ff");
    test_class_info(&lv, &cd_G2x7y5);
    dp->~G2x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y5(Test_G2x7y5, "G2x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G2x7y5C1Ev();
extern void _ZN6G2x7y5D1Ev();
Name_Map name_map_G2x7y5[] = {
  NSPAIR(_ZN6G2x7y5C1Ev),
  NSPAIR(_ZN6G2x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y5[];
static  VTBL_ENTRY vtc_G2x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x7y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G2x7y5[0]),
};
extern VTBL_ENTRY _ZTV6G2x7y5[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y5[] = {
  {&(_ZTV6G2x7y5[6]),  6,14},
  {&(_ZTV6G2x7y5[11]),  11,14},
  {&(_ZTV6G2x7y5[14]),  14,14},
  {&(_tg__ZTV4E2x7__6G2x7y5[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y5[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x7y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y5[];
extern  VTBL_ENTRY _ZTV6G2x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y5[];
Class_Descriptor cd_G2x7y5 = {  "G2x7y5", // class name
  bases_G2x7y5, 6,
  &(vtc_G2x7y5[0]), // expected_vtbl_contents
  &(vtt_G2x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G2x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y5),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y6  : E2x7 , virtual F0 {
  int ff;
  ~G2x7y6(); // tgen
  G2x7y6(); // tgen
};
//SIG(1 G2x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x7y6 ::~G2x7y6(){ note_dtor("G2x7y6", this);} // tgen
G2x7y6 ::G2x7y6(){ note_ctor("G2x7y6", this);} // tgen

static void Test_G2x7y6()
{
  extern Class_Descriptor cd_G2x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G2x7y6, buf);
    G2x7y6 *dp, &lv = *(dp=new (buf) G2x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G2x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y6)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(32,24), "G2x7y6");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(24,16), "G2x7y6");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(16,12), "G2x7y6");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(36,28), "G2x7y6");
    check_base_class_offset(lv, (E2x7*), 0, "G2x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G2x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G2x7y6.ff");
    test_class_info(&lv, &cd_G2x7y6);
    dp->~G2x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y6(Test_G2x7y6, "G2x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G2x7y6C1Ev();
extern void _ZN6G2x7y6D1Ev();
Name_Map name_map_G2x7y6[] = {
  NSPAIR(_ZN6G2x7y6C1Ev),
  NSPAIR(_ZN6G2x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y6[];
static  VTBL_ENTRY vtc_G2x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y6[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G2x7y6[0]),
};
extern VTBL_ENTRY _ZTV6G2x7y6[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y6[] = {
  {&(_ZTV6G2x7y6[6]),  6,9},
  {&(_tg__ZTV4E2x7__6G2x7y6[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y6[3]),  3,3},
  {&(_ZTV6G2x7y6[9]),  9,9},
  {&(_tg__ZTV2C2__6G2x7y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y6[];
extern  VTBL_ENTRY _ZTV6G2x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y6[];
Class_Descriptor cd_G2x7y6 = {  "G2x7y6", // class name
  bases_G2x7y6, 6,
  &(vtc_G2x7y6[0]), // expected_vtbl_contents
  &(vtt_G2x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G2x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y6),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G2x7y7  : virtual E2x7 , virtual F0 {
  int ff;
  ~G2x7y7(); // tgen
  G2x7y7(); // tgen
};
//SIG(1 G2x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G2x7y7 ::~G2x7y7(){ note_dtor("G2x7y7", this);} // tgen
G2x7y7 ::G2x7y7(){ note_ctor("G2x7y7", this);} // tgen

static void Test_G2x7y7()
{
  extern Class_Descriptor cd_G2x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G2x7y7, buf);
    G2x7y7 *dp, &lv = *(dp=new (buf) G2x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G2x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G2x7y7)");
    check_base_class_offset(lv, (A0*)(C2*), ABISELECT(48,28), "G2x7y7");
    check_base_class_offset(lv, (B0*)(C2*), ABISELECT(40,20), "G2x7y7");
    check_base_class_offset(lv, (C2*)(E2x7*), ABISELECT(32,16), "G2x7y7");
    check_base_class_offset(lv, (D0*)(E2x7*), ABISELECT(52,32), "G2x7y7");
    check_base_class_offset(lv, (E2x7*), ABISELECT(16,8), "G2x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G2x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G2x7y7.ff");
    test_class_info(&lv, &cd_G2x7y7);
    dp->~G2x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG2x7y7(Test_G2x7y7, "G2x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G2x7y7C1Ev();
extern void _ZN6G2x7y7D1Ev();
Name_Map name_map_G2x7y7[] = {
  NSPAIR(_ZN6G2x7y7C1Ev),
  NSPAIR(_ZN6G2x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C2;
extern VTBL_ENTRY _ZTI2C2[];
extern  VTBL_ENTRY _ZTV2C2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C2[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E2x7;
extern VTBL_ENTRY _ZTI4E2x7[];
extern  VTBL_ENTRY _ZTV4E2x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E2x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G2x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C2,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E2x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G2x7y7[];
static  VTBL_ENTRY vtc_G2x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G2x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G2x7y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G2x7y7[0]),
};
extern VTBL_ENTRY _ZTV6G2x7y7[];
static  VTBL_ENTRY _tg__ZTV4E2x7__6G2x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__4E2x7__6G2x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E2x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C2__6G2x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C2[0]),
};
static  VTT_ENTRY vtt_G2x7y7[] = {
  {&(_ZTV6G2x7y7[7]),  7,15},
  {&(_ZTV6G2x7y7[12]),  12,15},
  {&(_ZTV6G2x7y7[15]),  15,15},
  {&(_tg__ZTV4E2x7__6G2x7y7[5]),  5,5},
  {&(_tg__ZTV2C2__4E2x7__6G2x7y7[3]),  3,3},
  {&(_tg__ZTV2C2__6G2x7y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G2x7y7[];
extern  VTBL_ENTRY _ZTV6G2x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G2x7y7[];
Class_Descriptor cd_G2x7y7 = {  "G2x7y7", // class name
  bases_G2x7y7, 6,
  &(vtc_G2x7y7[0]), // expected_vtbl_contents
  &(vtt_G2x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G2x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G2x7y7),15, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G2x7y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E3x7  : virtual C3 , virtual D0 {
  int fd;
  ~E3x7(); // tgen
  E3x7(); // tgen
};
//SIG(-1 E3x7) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} Fi} VBC5{ Fi} Fi}


E3x7 ::~E3x7(){ note_dtor("E3x7", this);} // tgen
E3x7 ::E3x7(){ note_ctor("E3x7", this);} // tgen

static void Test_E3x7()
{
  extern Class_Descriptor cd_E3x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E3x7, buf);
    E3x7 *dp, &lv = *(dp=new (buf) E3x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E3x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E3x7)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,20), "E3x7");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,12), "E3x7");
    check_base_class_offset(lv, (C3*), ABISELECT(16,8), "E3x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E3x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E3x7.fd");
    test_class_info(&lv, &cd_E3x7);
    dp->~E3x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE3x7(Test_E3x7, "E3x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN4E3x7C1Ev();
extern void _ZN4E3x7D1Ev();
Name_Map name_map_E3x7[] = {
  NSPAIR(_ZN4E3x7C1Ev),
  NSPAIR(_ZN4E3x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E3x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E3x7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E3x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E3x7[];
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__4E3x7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E3x7[] = {
  {&(_ZTV4E3x7[5]),  5,12},
  {&(_ZTV4E3x7[8]),  8,12},
  {&(_ZTV4E3x7[11]),  11,12},
  {&(_tg__ZTV2C3__4E3x7[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__4E3x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
Class_Descriptor cd_E3x7 = {  "E3x7", // class name
  bases_E3x7, 4,
  &(vtc_E3x7[0]), // expected_vtbl_contents
  &(vtt_E3x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI4E3x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E3x7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E3x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y0  : E3x7 , F1 {
  int ff;
  ~G3x7y0(); // tgen
  G3x7y0(); // tgen
};
//SIG(1 G3x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x7y0 ::~G3x7y0(){ note_dtor("G3x7y0", this);} // tgen
G3x7y0 ::G3x7y0(){ note_ctor("G3x7y0", this);} // tgen

static void Test_G3x7y0()
{
  extern Class_Descriptor cd_G3x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x7y0, buf);
    G3x7y0 *dp, &lv = *(dp=new (buf) G3x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y0)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x7y0");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x7y0");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(32,20), "G3x7y0");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(60,40), "G3x7y0");
    check_base_class_offset(lv, (E3x7*), 0, "G3x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G3x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G3x7y0.ff");
    test_class_info(&lv, &cd_G3x7y0);
    dp->~G3x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y0(Test_G3x7y0, "G3x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x7y0C1Ev();
extern void _ZN6G3x7y0D1Ev();
Name_Map name_map_G3x7y0[] = {
  NSPAIR(_ZN6G3x7y0C1Ev),
  NSPAIR(_ZN6G3x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G3x7y0[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G3x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y0[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y0[] = {
  {&(_ZTV6G3x7y0[5]),  5,15},
  {&(_tg__ZTV4E3x7__6G3x7y0[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y0[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y0[3]),  3,4},
  {&(_ZTV6G3x7y0[11]),  11,15},
  {&(_ZTV6G3x7y0[14]),  14,15},
  {&(_tg__ZTV2C3__6G3x7y0[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y0[];
extern  VTBL_ENTRY _ZTV6G3x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y0[];
Class_Descriptor cd_G3x7y0 = {  "G3x7y0", // class name
  bases_G3x7y0, 6,
  &(vtc_G3x7y0[0]), // expected_vtbl_contents
  &(vtt_G3x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y0),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y1  : virtual E3x7 , F1 {
  int ff;
  ~G3x7y1(); // tgen
  G3x7y1(); // tgen
};
//SIG(1 G3x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G3x7y1 ::~G3x7y1(){ note_dtor("G3x7y1", this);} // tgen
G3x7y1 ::G3x7y1(){ note_ctor("G3x7y1", this);} // tgen

static void Test_G3x7y1()
{
  extern Class_Descriptor cd_G3x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x7y1, buf);
    G3x7y1 *dp, &lv = *(dp=new (buf) G3x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y1)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x7y1");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x7y1");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(32,20), "G3x7y1");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(60,40), "G3x7y1");
    check_base_class_offset(lv, (E3x7*), ABISELECT(16,12), "G3x7y1");
    check_base_class_offset(lv, (F1*), 0, "G3x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x7y1.ff");
    test_class_info(&lv, &cd_G3x7y1);
    dp->~G3x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y1(Test_G3x7y1, "G3x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x7y1C1Ev();
extern void _ZN6G3x7y1D1Ev();
Name_Map name_map_G3x7y1[] = {
  NSPAIR(_ZN6G3x7y1C1Ev),
  NSPAIR(_ZN6G3x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x7y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G3x7y1[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G3x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y1[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y1[] = {
  {&(_ZTV6G3x7y1[6]),  6,19},
  {&(_ZTV6G3x7y1[12]),  12,19},
  {&(_ZTV6G3x7y1[15]),  15,19},
  {&(_ZTV6G3x7y1[18]),  18,19},
  {&(_tg__ZTV4E3x7__6G3x7y1[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y1[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y1[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x7y1[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y1[];
extern  VTBL_ENTRY _ZTV6G3x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y1[];
Class_Descriptor cd_G3x7y1 = {  "G3x7y1", // class name
  bases_G3x7y1, 6,
  &(vtc_G3x7y1[0]), // expected_vtbl_contents
  &(vtt_G3x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y2  : E3x7 , virtual F1 {
  int ff;
  ~G3x7y2(); // tgen
  G3x7y2(); // tgen
};
//SIG(1 G3x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x7y2 ::~G3x7y2(){ note_dtor("G3x7y2", this);} // tgen
G3x7y2 ::G3x7y2(){ note_ctor("G3x7y2", this);} // tgen

static void Test_G3x7y2()
{
  extern Class_Descriptor cd_G3x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x7y2, buf);
    G3x7y2 *dp, &lv = *(dp=new (buf) G3x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y2)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,24), "G3x7y2");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,16), "G3x7y2");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(16,12), "G3x7y2");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(44,32), "G3x7y2");
    check_base_class_offset(lv, (E3x7*), 0, "G3x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G3x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x7y2.ff");
    test_class_info(&lv, &cd_G3x7y2);
    dp->~G3x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y2(Test_G3x7y2, "G3x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x7y2C1Ev();
extern void _ZN6G3x7y2D1Ev();
Name_Map name_map_G3x7y2[] = {
  NSPAIR(_ZN6G3x7y2C1Ev),
  NSPAIR(_ZN6G3x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y2[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x7y2[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G3x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y2[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y2[] = {
  {&(_ZTV6G3x7y2[6]),  6,17},
  {&(_tg__ZTV4E3x7__6G3x7y2[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y2[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y2[3]),  3,4},
  {&(_ZTV6G3x7y2[9]),  9,17},
  {&(_ZTV6G3x7y2[12]),  12,17},
  {&(_ZTV6G3x7y2[16]),  16,17},
  {&(_tg__ZTV2C3__6G3x7y2[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y2[];
extern  VTBL_ENTRY _ZTV6G3x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y2[];
Class_Descriptor cd_G3x7y2 = {  "G3x7y2", // class name
  bases_G3x7y2, 6,
  &(vtc_G3x7y2[0]), // expected_vtbl_contents
  &(vtt_G3x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y2),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y3  : virtual E3x7 , virtual F1 {
  int ff;
  ~G3x7y3(); // tgen
  G3x7y3(); // tgen
};
//SIG(1 G3x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G3x7y3 ::~G3x7y3(){ note_dtor("G3x7y3", this);} // tgen
G3x7y3 ::G3x7y3(){ note_ctor("G3x7y3", this);} // tgen

static void Test_G3x7y3()
{
  extern Class_Descriptor cd_G3x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G3x7y3, buf);
    G3x7y3 *dp, &lv = *(dp=new (buf) G3x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G3x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y3)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,28), "G3x7y3");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,20), "G3x7y3");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(32,16), "G3x7y3");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(60,36), "G3x7y3");
    check_base_class_offset(lv, (E3x7*), ABISELECT(16,8), "G3x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G3x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x7y3.ff");
    test_class_info(&lv, &cd_G3x7y3);
    dp->~G3x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y3(Test_G3x7y3, "G3x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN6G3x7y3C1Ev();
extern void _ZN6G3x7y3D1Ev();
Name_Map name_map_G3x7y3[] = {
  NSPAIR(_ZN6G3x7y3C1Ev),
  NSPAIR(_ZN6G3x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G3x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G3x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x7y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G3x7y3[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G3x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6G3x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y3[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y3[] = {
  {&(_ZTV6G3x7y3[7]),  7,23},
  {&(_ZTV6G3x7y3[12]),  12,23},
  {&(_ZTV6G3x7y3[15]),  15,23},
  {&(_ZTV6G3x7y3[18]),  18,23},
  {&(_ZTV6G3x7y3[22]),  22,23},
  {&(_tg__ZTV4E3x7__6G3x7y3[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y3[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y3[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x7y3[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y3[];
extern  VTBL_ENTRY _ZTV6G3x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y3[];
Class_Descriptor cd_G3x7y3 = {  "G3x7y3", // class name
  bases_G3x7y3, 6,
  &(vtc_G3x7y3[0]), // expected_vtbl_contents
  &(vtt_G3x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI6G3x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y4  : E3x7 , F0 {
  int ff;
  ~G3x7y4(); // tgen
  G3x7y4(); // tgen
};
//SIG(1 G3x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G3x7y4 ::~G3x7y4(){ note_dtor("G3x7y4", this);} // tgen
G3x7y4 ::G3x7y4(){ note_ctor("G3x7y4", this);} // tgen

static void Test_G3x7y4()
{
  extern Class_Descriptor cd_G3x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x7y4, buf);
    G3x7y4 *dp, &lv = *(dp=new (buf) G3x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y4)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(40,28), "G3x7y4");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(32,20), "G3x7y4");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(24,16), "G3x7y4");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(52,36), "G3x7y4");
    check_base_class_offset(lv, (E3x7*), 0, "G3x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G3x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G3x7y4.ff");
    test_class_info(&lv, &cd_G3x7y4);
    dp->~G3x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y4(Test_G3x7y4, "G3x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x7y4C1Ev();
extern void _ZN6G3x7y4D1Ev();
Name_Map name_map_G3x7y4[] = {
  NSPAIR(_ZN6G3x7y4C1Ev),
  NSPAIR(_ZN6G3x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G3x7y4[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G3x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y4[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y4[] = {
  {&(_ZTV6G3x7y4[5]),  5,12},
  {&(_tg__ZTV4E3x7__6G3x7y4[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y4[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y4[3]),  3,4},
  {&(_ZTV6G3x7y4[8]),  8,12},
  {&(_ZTV6G3x7y4[11]),  11,12},
  {&(_tg__ZTV2C3__6G3x7y4[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y4[];
extern  VTBL_ENTRY _ZTV6G3x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y4[];
Class_Descriptor cd_G3x7y4 = {  "G3x7y4", // class name
  bases_G3x7y4, 6,
  &(vtc_G3x7y4[0]), // expected_vtbl_contents
  &(vtt_G3x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y4),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y5  : virtual E3x7 , F0 {
  int ff;
  ~G3x7y5(); // tgen
  G3x7y5(); // tgen
};
//SIG(1 G3x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G3x7y5 ::~G3x7y5(){ note_dtor("G3x7y5", this);} // tgen
G3x7y5 ::G3x7y5(){ note_ctor("G3x7y5", this);} // tgen

static void Test_G3x7y5()
{
  extern Class_Descriptor cd_G3x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G3x7y5, buf);
    G3x7y5 *dp, &lv = *(dp=new (buf) G3x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G3x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y5)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,32), "G3x7y5");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,24), "G3x7y5");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(32,20), "G3x7y5");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(60,40), "G3x7y5");
    check_base_class_offset(lv, (E3x7*), ABISELECT(16,12), "G3x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G3x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x7y5.ff");
    test_class_info(&lv, &cd_G3x7y5);
    dp->~G3x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y5(Test_G3x7y5, "G3x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G3x7y5C1Ev();
extern void _ZN6G3x7y5D1Ev();
Name_Map name_map_G3x7y5[] = {
  NSPAIR(_ZN6G3x7y5C1Ev),
  NSPAIR(_ZN6G3x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x7y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G3x7y5[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G3x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y5[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y5[] = {
  {&(_ZTV6G3x7y5[6]),  6,18},
  {&(_ZTV6G3x7y5[11]),  11,18},
  {&(_ZTV6G3x7y5[14]),  14,18},
  {&(_ZTV6G3x7y5[17]),  17,18},
  {&(_tg__ZTV4E3x7__6G3x7y5[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y5[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y5[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x7y5[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y5[];
extern  VTBL_ENTRY _ZTV6G3x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y5[];
Class_Descriptor cd_G3x7y5 = {  "G3x7y5", // class name
  bases_G3x7y5, 6,
  &(vtc_G3x7y5[0]), // expected_vtbl_contents
  &(vtt_G3x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G3x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y6  : E3x7 , virtual F0 {
  int ff;
  ~G3x7y6(); // tgen
  G3x7y6(); // tgen
};
//SIG(1 G3x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x7y6 ::~G3x7y6(){ note_dtor("G3x7y6", this);} // tgen
G3x7y6 ::G3x7y6(){ note_ctor("G3x7y6", this);} // tgen

static void Test_G3x7y6()
{
  extern Class_Descriptor cd_G3x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G3x7y6, buf);
    G3x7y6 *dp, &lv = *(dp=new (buf) G3x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G3x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y6)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(32,24), "G3x7y6");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(24,16), "G3x7y6");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(16,12), "G3x7y6");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(44,32), "G3x7y6");
    check_base_class_offset(lv, (E3x7*), 0, "G3x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G3x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G3x7y6.ff");
    test_class_info(&lv, &cd_G3x7y6);
    dp->~G3x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y6(Test_G3x7y6, "G3x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G3x7y6C1Ev();
extern void _ZN6G3x7y6D1Ev();
Name_Map name_map_G3x7y6[] = {
  NSPAIR(_ZN6G3x7y6C1Ev),
  NSPAIR(_ZN6G3x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y6[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G3x7y6[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G3x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y6[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y6[] = {
  {&(_ZTV6G3x7y6[6]),  6,13},
  {&(_tg__ZTV4E3x7__6G3x7y6[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y6[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y6[3]),  3,4},
  {&(_ZTV6G3x7y6[9]),  9,13},
  {&(_ZTV6G3x7y6[12]),  12,13},
  {&(_tg__ZTV2C3__6G3x7y6[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y6[];
extern  VTBL_ENTRY _ZTV6G3x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y6[];
Class_Descriptor cd_G3x7y6 = {  "G3x7y6", // class name
  bases_G3x7y6, 6,
  &(vtc_G3x7y6[0]), // expected_vtbl_contents
  &(vtt_G3x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G3x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y6),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G3x7y7  : virtual E3x7 , virtual F0 {
  int ff;
  ~G3x7y7(); // tgen
  G3x7y7(); // tgen
};
//SIG(1 G3x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G3x7y7 ::~G3x7y7(){ note_dtor("G3x7y7", this);} // tgen
G3x7y7 ::G3x7y7(){ note_ctor("G3x7y7", this);} // tgen

static void Test_G3x7y7()
{
  extern Class_Descriptor cd_G3x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G3x7y7, buf);
    G3x7y7 *dp, &lv = *(dp=new (buf) G3x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G3x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G3x7y7)");
    check_base_class_offset(lv, (A1*)(C3*), ABISELECT(48,28), "G3x7y7");
    check_base_class_offset(lv, (B0*)(C3*), ABISELECT(40,20), "G3x7y7");
    check_base_class_offset(lv, (C3*)(E3x7*), ABISELECT(32,16), "G3x7y7");
    check_base_class_offset(lv, (D0*)(E3x7*), ABISELECT(60,36), "G3x7y7");
    check_base_class_offset(lv, (E3x7*), ABISELECT(16,8), "G3x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G3x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G3x7y7.ff");
    test_class_info(&lv, &cd_G3x7y7);
    dp->~G3x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG3x7y7(Test_G3x7y7, "G3x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G3x7y7C1Ev();
extern void _ZN6G3x7y7D1Ev();
Name_Map name_map_G3x7y7[] = {
  NSPAIR(_ZN6G3x7y7C1Ev),
  NSPAIR(_ZN6G3x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C3;
extern VTBL_ENTRY _ZTI2C3[];
extern  VTBL_ENTRY _ZTV2C3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C3[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E3x7;
extern VTBL_ENTRY _ZTI4E3x7[];
extern  VTBL_ENTRY _ZTV4E3x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E3x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G3x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C3,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E3x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G3x7y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G3x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G3x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G3x7y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G3x7y7[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G3x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G3x7y7[];
static  VTBL_ENTRY _tg__ZTV4E3x7__6G3x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C3__4E3x7__6G3x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E3x7__6G3x7y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E3x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV2C3__6G3x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C3[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C3__6G3x7y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G3x7y7[] = {
  {&(_ZTV6G3x7y7[7]),  7,19},
  {&(_ZTV6G3x7y7[12]),  12,19},
  {&(_ZTV6G3x7y7[15]),  15,19},
  {&(_ZTV6G3x7y7[18]),  18,19},
  {&(_tg__ZTV4E3x7__6G3x7y7[5]),  5,5},
  {&(_tg__ZTV2C3__4E3x7__6G3x7y7[3]),  3,3},
  {&(_tg__ZTV2A1__4E3x7__6G3x7y7[3]),  3,4},
  {&(_tg__ZTV2C3__6G3x7y7[3]),  3,3},
  {&(_tg__ZTV2A1__2C3__6G3x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G3x7y7[];
extern  VTBL_ENTRY _ZTV6G3x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G3x7y7[];
Class_Descriptor cd_G3x7y7 = {  "G3x7y7", // class name
  bases_G3x7y7, 6,
  &(vtc_G3x7y7[0]), // expected_vtbl_contents
  &(vtt_G3x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G3x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G3x7y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G3x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E4x7  : virtual C4 , virtual D0 {
  int fd;
  ~E4x7(); // tgen
  E4x7(); // tgen
};
//SIG(-1 E4x7) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E4x7 ::~E4x7(){ note_dtor("E4x7", this);} // tgen
E4x7 ::E4x7(){ note_ctor("E4x7", this);} // tgen

static void Test_E4x7()
{
  extern Class_Descriptor cd_E4x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E4x7, buf);
    E4x7 *dp, &lv = *(dp=new (buf) E4x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E4x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E4x7)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,16), "E4x7");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,8), "E4x7");
    check_base_class_offset(lv, (C4*), ABISELECT(16,8), "E4x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E4x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E4x7.fd");
    test_class_info(&lv, &cd_E4x7);
    dp->~E4x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE4x7(Test_E4x7, "E4x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E4x7C1Ev();
extern void _ZN4E4x7D1Ev();
Name_Map name_map_E4x7[] = {
  NSPAIR(_ZN4E4x7C1Ev),
  NSPAIR(_ZN4E4x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E4x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E4x7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E4x7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E4x7[];
static  VTT_ENTRY vtt_E4x7[] = {
  {&(_ZTV4E4x7[4]),  4,8},
  {&(_ZTV4E4x7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
Class_Descriptor cd_E4x7 = {  "E4x7", // class name
  bases_E4x7, 4,
  &(vtc_E4x7[0]), // expected_vtbl_contents
  &(vtt_E4x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E4x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E4x7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E4x7),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y0  : E4x7 , F1 {
  int ff;
  ~G4x7y0(); // tgen
  G4x7y0(); // tgen
};
//SIG(1 G4x7y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x7y0 ::~G4x7y0(){ note_dtor("G4x7y0", this);} // tgen
G4x7y0 ::G4x7y0(){ note_ctor("G4x7y0", this);} // tgen

static void Test_G4x7y0()
{
  extern Class_Descriptor cd_G4x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x7y0, buf);
    G4x7y0 *dp, &lv = *(dp=new (buf) G4x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y0)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x7y0");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x7y0");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(32,20), "G4x7y0");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(52,36), "G4x7y0");
    check_base_class_offset(lv, (E4x7*), 0, "G4x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G4x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G4x7y0.ff");
    test_class_info(&lv, &cd_G4x7y0);
    dp->~G4x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y0(Test_G4x7y0, "G4x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x7y0C1Ev();
extern void _ZN6G4x7y0D1Ev();
Name_Map name_map_G4x7y0[] = {
  NSPAIR(_ZN6G4x7y0C1Ev),
  NSPAIR(_ZN6G4x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G4x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y0[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y0[] = {
  {&(_ZTV6G4x7y0[4]),  4,11},
  {&(_tg__ZTV4E4x7__6G4x7y0[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y0[3]),  3,4},
  {&(_ZTV6G4x7y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G4x7y0[];
extern  VTBL_ENTRY _ZTV6G4x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y0[];
Class_Descriptor cd_G4x7y0 = {  "G4x7y0", // class name
  bases_G4x7y0, 6,
  &(vtc_G4x7y0[0]), // expected_vtbl_contents
  &(vtt_G4x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y1  : virtual E4x7 , F1 {
  int ff;
  ~G4x7y1(); // tgen
  G4x7y1(); // tgen
};
//SIG(1 G4x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G4x7y1 ::~G4x7y1(){ note_dtor("G4x7y1", this);} // tgen
G4x7y1 ::G4x7y1(){ note_ctor("G4x7y1", this);} // tgen

static void Test_G4x7y1()
{
  extern Class_Descriptor cd_G4x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x7y1, buf);
    G4x7y1 *dp, &lv = *(dp=new (buf) G4x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y1)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x7y1");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x7y1");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(32,20), "G4x7y1");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(52,36), "G4x7y1");
    check_base_class_offset(lv, (E4x7*), ABISELECT(16,12), "G4x7y1");
    check_base_class_offset(lv, (F1*), 0, "G4x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x7y1.ff");
    test_class_info(&lv, &cd_G4x7y1);
    dp->~G4x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y1(Test_G4x7y1, "G4x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x7y1C1Ev();
extern void _ZN6G4x7y1D1Ev();
Name_Map name_map_G4x7y1[] = {
  NSPAIR(_ZN6G4x7y1C1Ev),
  NSPAIR(_ZN6G4x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G4x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y1[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y1[] = {
  {&(_ZTV6G4x7y1[5]),  5,14},
  {&(_ZTV6G4x7y1[10]),  10,14},
  {&(_ZTV6G4x7y1[13]),  13,14},
  {&(_tg__ZTV4E4x7__6G4x7y1[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x7y1[];
extern  VTBL_ENTRY _ZTV6G4x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y1[];
Class_Descriptor cd_G4x7y1 = {  "G4x7y1", // class name
  bases_G4x7y1, 6,
  &(vtc_G4x7y1[0]), // expected_vtbl_contents
  &(vtt_G4x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y2  : E4x7 , virtual F1 {
  int ff;
  ~G4x7y2(); // tgen
  G4x7y2(); // tgen
};
//SIG(1 G4x7y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x7y2 ::~G4x7y2(){ note_dtor("G4x7y2", this);} // tgen
G4x7y2 ::G4x7y2(){ note_ctor("G4x7y2", this);} // tgen

static void Test_G4x7y2()
{
  extern Class_Descriptor cd_G4x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x7y2, buf);
    G4x7y2 *dp, &lv = *(dp=new (buf) G4x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y2)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,20), "G4x7y2");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,12), "G4x7y2");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(16,12), "G4x7y2");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(36,28), "G4x7y2");
    check_base_class_offset(lv, (E4x7*), 0, "G4x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G4x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x7y2.ff");
    test_class_info(&lv, &cd_G4x7y2);
    dp->~G4x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y2(Test_G4x7y2, "G4x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x7y2C1Ev();
extern void _ZN6G4x7y2D1Ev();
Name_Map name_map_G4x7y2[] = {
  NSPAIR(_ZN6G4x7y2C1Ev),
  NSPAIR(_ZN6G4x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G4x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y2[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y2[] = {
  {&(_ZTV6G4x7y2[5]),  5,13},
  {&(_tg__ZTV4E4x7__6G4x7y2[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y2[3]),  3,4},
  {&(_ZTV6G4x7y2[8]),  8,13},
  {&(_ZTV6G4x7y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI6G4x7y2[];
extern  VTBL_ENTRY _ZTV6G4x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y2[];
Class_Descriptor cd_G4x7y2 = {  "G4x7y2", // class name
  bases_G4x7y2, 6,
  &(vtc_G4x7y2[0]), // expected_vtbl_contents
  &(vtt_G4x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y3  : virtual E4x7 , virtual F1 {
  int ff;
  ~G4x7y3(); // tgen
  G4x7y3(); // tgen
};
//SIG(1 G4x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G4x7y3 ::~G4x7y3(){ note_dtor("G4x7y3", this);} // tgen
G4x7y3 ::G4x7y3(){ note_ctor("G4x7y3", this);} // tgen

static void Test_G4x7y3()
{
  extern Class_Descriptor cd_G4x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G4x7y3, buf);
    G4x7y3 *dp, &lv = *(dp=new (buf) G4x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G4x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y3)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,24), "G4x7y3");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,16), "G4x7y3");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(32,16), "G4x7y3");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(52,32), "G4x7y3");
    check_base_class_offset(lv, (E4x7*), ABISELECT(16,8), "G4x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G4x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x7y3.ff");
    test_class_info(&lv, &cd_G4x7y3);
    dp->~G4x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y3(Test_G4x7y3, "G4x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G4x7y3C1Ev();
extern void _ZN6G4x7y3D1Ev();
Name_Map name_map_G4x7y3[] = {
  NSPAIR(_ZN6G4x7y3C1Ev),
  NSPAIR(_ZN6G4x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G4x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G4x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G4x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G4x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y3[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y3[] = {
  {&(_ZTV6G4x7y3[6]),  6,18},
  {&(_ZTV6G4x7y3[10]),  10,18},
  {&(_ZTV6G4x7y3[13]),  13,18},
  {&(_ZTV6G4x7y3[17]),  17,18},
  {&(_tg__ZTV4E4x7__6G4x7y3[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x7y3[];
extern  VTBL_ENTRY _ZTV6G4x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y3[];
Class_Descriptor cd_G4x7y3 = {  "G4x7y3", // class name
  bases_G4x7y3, 6,
  &(vtc_G4x7y3[0]), // expected_vtbl_contents
  &(vtt_G4x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G4x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y4  : E4x7 , F0 {
  int ff;
  ~G4x7y4(); // tgen
  G4x7y4(); // tgen
};
//SIG(1 G4x7y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G4x7y4 ::~G4x7y4(){ note_dtor("G4x7y4", this);} // tgen
G4x7y4 ::G4x7y4(){ note_ctor("G4x7y4", this);} // tgen

static void Test_G4x7y4()
{
  extern Class_Descriptor cd_G4x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x7y4, buf);
    G4x7y4 *dp, &lv = *(dp=new (buf) G4x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y4)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(36,24), "G4x7y4");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(24,16), "G4x7y4");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(24,16), "G4x7y4");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(44,32), "G4x7y4");
    check_base_class_offset(lv, (E4x7*), 0, "G4x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G4x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G4x7y4.ff");
    test_class_info(&lv, &cd_G4x7y4);
    dp->~G4x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y4(Test_G4x7y4, "G4x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x7y4C1Ev();
extern void _ZN6G4x7y4D1Ev();
Name_Map name_map_G4x7y4[] = {
  NSPAIR(_ZN6G4x7y4C1Ev),
  NSPAIR(_ZN6G4x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G4x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y4[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y4[] = {
  {&(_ZTV6G4x7y4[4]),  4,8},
  {&(_tg__ZTV4E4x7__6G4x7y4[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y4[3]),  3,4},
  {&(_ZTV6G4x7y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI6G4x7y4[];
extern  VTBL_ENTRY _ZTV6G4x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y4[];
Class_Descriptor cd_G4x7y4 = {  "G4x7y4", // class name
  bases_G4x7y4, 6,
  &(vtc_G4x7y4[0]), // expected_vtbl_contents
  &(vtt_G4x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y5  : virtual E4x7 , F0 {
  int ff;
  ~G4x7y5(); // tgen
  G4x7y5(); // tgen
};
//SIG(1 G4x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G4x7y5 ::~G4x7y5(){ note_dtor("G4x7y5", this);} // tgen
G4x7y5 ::G4x7y5(){ note_ctor("G4x7y5", this);} // tgen

static void Test_G4x7y5()
{
  extern Class_Descriptor cd_G4x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G4x7y5, buf);
    G4x7y5 *dp, &lv = *(dp=new (buf) G4x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G4x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y5)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,28), "G4x7y5");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,20), "G4x7y5");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(32,20), "G4x7y5");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(52,36), "G4x7y5");
    check_base_class_offset(lv, (E4x7*), ABISELECT(16,12), "G4x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G4x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x7y5.ff");
    test_class_info(&lv, &cd_G4x7y5);
    dp->~G4x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y5(Test_G4x7y5, "G4x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G4x7y5C1Ev();
extern void _ZN6G4x7y5D1Ev();
Name_Map name_map_G4x7y5[] = {
  NSPAIR(_ZN6G4x7y5C1Ev),
  NSPAIR(_ZN6G4x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G4x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y5[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y5[] = {
  {&(_ZTV6G4x7y5[5]),  5,13},
  {&(_ZTV6G4x7y5[9]),  9,13},
  {&(_ZTV6G4x7y5[12]),  12,13},
  {&(_tg__ZTV4E4x7__6G4x7y5[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x7y5[];
extern  VTBL_ENTRY _ZTV6G4x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y5[];
Class_Descriptor cd_G4x7y5 = {  "G4x7y5", // class name
  bases_G4x7y5, 6,
  &(vtc_G4x7y5[0]), // expected_vtbl_contents
  &(vtt_G4x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G4x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y6  : E4x7 , virtual F0 {
  int ff;
  ~G4x7y6(); // tgen
  G4x7y6(); // tgen
};
//SIG(1 G4x7y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x7y6 ::~G4x7y6(){ note_dtor("G4x7y6", this);} // tgen
G4x7y6 ::G4x7y6(){ note_ctor("G4x7y6", this);} // tgen

static void Test_G4x7y6()
{
  extern Class_Descriptor cd_G4x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G4x7y6, buf);
    G4x7y6 *dp, &lv = *(dp=new (buf) G4x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G4x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y6)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(28,20), "G4x7y6");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(16,12), "G4x7y6");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(16,12), "G4x7y6");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(36,28), "G4x7y6");
    check_base_class_offset(lv, (E4x7*), 0, "G4x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G4x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G4x7y6.ff");
    test_class_info(&lv, &cd_G4x7y6);
    dp->~G4x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y6(Test_G4x7y6, "G4x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G4x7y6C1Ev();
extern void _ZN6G4x7y6D1Ev();
Name_Map name_map_G4x7y6[] = {
  NSPAIR(_ZN6G4x7y6C1Ev),
  NSPAIR(_ZN6G4x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G4x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y6[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y6[] = {
  {&(_ZTV6G4x7y6[5]),  5,9},
  {&(_tg__ZTV4E4x7__6G4x7y6[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y6[3]),  3,4},
  {&(_ZTV6G4x7y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI6G4x7y6[];
extern  VTBL_ENTRY _ZTV6G4x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y6[];
Class_Descriptor cd_G4x7y6 = {  "G4x7y6", // class name
  bases_G4x7y6, 6,
  &(vtc_G4x7y6[0]), // expected_vtbl_contents
  &(vtt_G4x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G4x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G4x7y7  : virtual E4x7 , virtual F0 {
  int ff;
  ~G4x7y7(); // tgen
  G4x7y7(); // tgen
};
//SIG(1 G4x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G4x7y7 ::~G4x7y7(){ note_dtor("G4x7y7", this);} // tgen
G4x7y7 ::G4x7y7(){ note_ctor("G4x7y7", this);} // tgen

static void Test_G4x7y7()
{
  extern Class_Descriptor cd_G4x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G4x7y7, buf);
    G4x7y7 *dp, &lv = *(dp=new (buf) G4x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G4x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G4x7y7)");
    check_base_class_offset(lv, (A0*)(C4*), ABISELECT(44,24), "G4x7y7");
    check_base_class_offset(lv, (B1*)(C4*), ABISELECT(32,16), "G4x7y7");
    check_base_class_offset(lv, (C4*)(E4x7*), ABISELECT(32,16), "G4x7y7");
    check_base_class_offset(lv, (D0*)(E4x7*), ABISELECT(52,32), "G4x7y7");
    check_base_class_offset(lv, (E4x7*), ABISELECT(16,8), "G4x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G4x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G4x7y7.ff");
    test_class_info(&lv, &cd_G4x7y7);
    dp->~G4x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG4x7y7(Test_G4x7y7, "G4x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G4x7y7C1Ev();
extern void _ZN6G4x7y7D1Ev();
Name_Map name_map_G4x7y7[] = {
  NSPAIR(_ZN6G4x7y7C1Ev),
  NSPAIR(_ZN6G4x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C4;
extern VTBL_ENTRY _ZTI2C4[];
extern  VTBL_ENTRY _ZTV2C4[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E4x7;
extern VTBL_ENTRY _ZTI4E4x7[];
extern  VTBL_ENTRY _ZTV4E4x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E4x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G4x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C4,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E4x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G4x7y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G4x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G4x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G4x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G4x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G4x7y7[];
static  VTBL_ENTRY _tg__ZTV4E4x7__6G4x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C4__4E4x7__6G4x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E4x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G4x7y7[] = {
  {&(_ZTV6G4x7y7[6]),  6,14},
  {&(_ZTV6G4x7y7[10]),  10,14},
  {&(_ZTV6G4x7y7[13]),  13,14},
  {&(_tg__ZTV4E4x7__6G4x7y7[4]),  4,4},
  {&(_tg__ZTV2B12C4__4E4x7__6G4x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G4x7y7[];
extern  VTBL_ENTRY _ZTV6G4x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G4x7y7[];
Class_Descriptor cd_G4x7y7 = {  "G4x7y7", // class name
  bases_G4x7y7, 6,
  &(vtc_G4x7y7[0]), // expected_vtbl_contents
  &(vtt_G4x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G4x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G4x7y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G4x7y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E5x7  : virtual C5 , virtual D0 {
  int fd;
  ~E5x7(); // tgen
  E5x7(); // tgen
};
//SIG(-1 E5x7) C1{ VBC2{ BC3{ v1 Fi} BC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E5x7 ::~E5x7(){ note_dtor("E5x7", this);} // tgen
E5x7 ::E5x7(){ note_ctor("E5x7", this);} // tgen

static void Test_E5x7()
{
  extern Class_Descriptor cd_E5x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E5x7, buf);
    E5x7 *dp, &lv = *(dp=new (buf) E5x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E5x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E5x7)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,8), "E5x7");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,16), "E5x7");
    check_base_class_offset(lv, (C5*), ABISELECT(16,8), "E5x7");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E5x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E5x7.fd");
    test_class_info(&lv, &cd_E5x7);
    dp->~E5x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE5x7(Test_E5x7, "E5x7", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN4E5x7C1Ev();
extern void _ZN4E5x7D1Ev();
Name_Map name_map_E5x7[] = {
  NSPAIR(_ZN4E5x7C1Ev),
  NSPAIR(_ZN4E5x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E5x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E5x7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E5x7[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E5x7[];
static  VTT_ENTRY vtt_E5x7[] = {
  {&(_ZTV4E5x7[4]),  4,11},
  {&(_ZTV4E5x7[7]),  7,11},
  {&(_ZTV4E5x7[10]),  10,11},
};
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
Class_Descriptor cd_E5x7 = {  "E5x7", // class name
  bases_E5x7, 4,
  &(vtc_E5x7[0]), // expected_vtbl_contents
  &(vtt_E5x7[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI4E5x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E5x7),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E5x7),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y0  : E5x7 , F1 {
  int ff;
  ~G5x7y0(); // tgen
  G5x7y0(); // tgen
};
//SIG(1 G5x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x7y0 ::~G5x7y0(){ note_dtor("G5x7y0", this);} // tgen
G5x7y0 ::G5x7y0(){ note_ctor("G5x7y0", this);} // tgen

static void Test_G5x7y0()
{
  extern Class_Descriptor cd_G5x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x7y0, buf);
    G5x7y0 *dp, &lv = *(dp=new (buf) G5x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y0)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x7y0");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x7y0");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(32,20), "G5x7y0");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(64,40), "G5x7y0");
    check_base_class_offset(lv, (E5x7*), 0, "G5x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G5x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G5x7y0.ff");
    test_class_info(&lv, &cd_G5x7y0);
    dp->~G5x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y0(Test_G5x7y0, "G5x7y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x7y0C1Ev();
extern void _ZN6G5x7y0D1Ev();
Name_Map name_map_G5x7y0[] = {
  NSPAIR(_ZN6G5x7y0C1Ev),
  NSPAIR(_ZN6G5x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G5x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y0[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y0[] = {
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y0[] = {
  {&(_ZTV6G5x7y0[4]),  4,14},
  {&(_tg__ZTV4E5x7__6G5x7y0[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y0[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y0[2]),  2,3},
  {&(_ZTV6G5x7y0[10]),  10,14},
  {&(_ZTV6G5x7y0[13]),  13,14},
};
extern VTBL_ENTRY _ZTI6G5x7y0[];
extern  VTBL_ENTRY _ZTV6G5x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y0[];
Class_Descriptor cd_G5x7y0 = {  "G5x7y0", // class name
  bases_G5x7y0, 6,
  &(vtc_G5x7y0[0]), // expected_vtbl_contents
  &(vtt_G5x7y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y0),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y1  : virtual E5x7 , F1 {
  int ff;
  ~G5x7y1(); // tgen
  G5x7y1(); // tgen
};
//SIG(1 G5x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G5x7y1 ::~G5x7y1(){ note_dtor("G5x7y1", this);} // tgen
G5x7y1 ::G5x7y1(){ note_ctor("G5x7y1", this);} // tgen

static void Test_G5x7y1()
{
  extern Class_Descriptor cd_G5x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x7y1, buf);
    G5x7y1 *dp, &lv = *(dp=new (buf) G5x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y1)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x7y1");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x7y1");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(32,20), "G5x7y1");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(64,40), "G5x7y1");
    check_base_class_offset(lv, (E5x7*), ABISELECT(16,12), "G5x7y1");
    check_base_class_offset(lv, (F1*), 0, "G5x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x7y1.ff");
    test_class_info(&lv, &cd_G5x7y1);
    dp->~G5x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y1(Test_G5x7y1, "G5x7y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x7y1C1Ev();
extern void _ZN6G5x7y1D1Ev();
Name_Map name_map_G5x7y1[] = {
  NSPAIR(_ZN6G5x7y1C1Ev),
  NSPAIR(_ZN6G5x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    14, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x7y1[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G5x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y1[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y1[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y1[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y1[] = {
  {&(_ZTV6G5x7y1[5]),  5,17},
  {&(_ZTV6G5x7y1[10]),  10,17},
  {&(_ZTV6G5x7y1[13]),  13,17},
  {&(_ZTV6G5x7y1[16]),  16,17},
  {&(_tg__ZTV4E5x7__6G5x7y1[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y1[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x7y1[];
extern  VTBL_ENTRY _ZTV6G5x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y1[];
Class_Descriptor cd_G5x7y1 = {  "G5x7y1", // class name
  bases_G5x7y1, 6,
  &(vtc_G5x7y1[0]), // expected_vtbl_contents
  &(vtt_G5x7y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y2  : E5x7 , virtual F1 {
  int ff;
  ~G5x7y2(); // tgen
  G5x7y2(); // tgen
};
//SIG(1 G5x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x7y2 ::~G5x7y2(){ note_dtor("G5x7y2", this);} // tgen
G5x7y2 ::G5x7y2(){ note_ctor("G5x7y2", this);} // tgen

static void Test_G5x7y2()
{
  extern Class_Descriptor cd_G5x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x7y2, buf);
    G5x7y2 *dp, &lv = *(dp=new (buf) G5x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y2)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,12), "G5x7y2");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,20), "G5x7y2");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(16,12), "G5x7y2");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(48,32), "G5x7y2");
    check_base_class_offset(lv, (E5x7*), 0, "G5x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G5x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x7y2.ff");
    test_class_info(&lv, &cd_G5x7y2);
    dp->~G5x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y2(Test_G5x7y2, "G5x7y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x7y2C1Ev();
extern void _ZN6G5x7y2D1Ev();
Name_Map name_map_G5x7y2[] = {
  NSPAIR(_ZN6G5x7y2C1Ev),
  NSPAIR(_ZN6G5x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x7y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G5x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y2[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y2[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y2[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y2[] = {
  {&(_ZTV6G5x7y2[5]),  5,16},
  {&(_tg__ZTV4E5x7__6G5x7y2[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y2[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y2[2]),  2,3},
  {&(_ZTV6G5x7y2[8]),  8,16},
  {&(_ZTV6G5x7y2[11]),  11,16},
  {&(_ZTV6G5x7y2[15]),  15,16},
};
extern VTBL_ENTRY _ZTI6G5x7y2[];
extern  VTBL_ENTRY _ZTV6G5x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y2[];
Class_Descriptor cd_G5x7y2 = {  "G5x7y2", // class name
  bases_G5x7y2, 6,
  &(vtc_G5x7y2[0]), // expected_vtbl_contents
  &(vtt_G5x7y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y2),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y3  : virtual E5x7 , virtual F1 {
  int ff;
  ~G5x7y3(); // tgen
  G5x7y3(); // tgen
};
//SIG(1 G5x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G5x7y3 ::~G5x7y3(){ note_dtor("G5x7y3", this);} // tgen
G5x7y3 ::G5x7y3(){ note_ctor("G5x7y3", this);} // tgen

static void Test_G5x7y3()
{
  extern Class_Descriptor cd_G5x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G5x7y3, buf);
    G5x7y3 *dp, &lv = *(dp=new (buf) G5x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G5x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y3)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,16), "G5x7y3");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,24), "G5x7y3");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(32,16), "G5x7y3");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(64,36), "G5x7y3");
    check_base_class_offset(lv, (E5x7*), ABISELECT(16,8), "G5x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G5x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x7y3.ff");
    test_class_info(&lv, &cd_G5x7y3);
    dp->~G5x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y3(Test_G5x7y3, "G5x7y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN6G5x7y3C1Ev();
extern void _ZN6G5x7y3D1Ev();
Name_Map name_map_G5x7y3[] = {
  NSPAIR(_ZN6G5x7y3C1Ev),
  NSPAIR(_ZN6G5x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G5x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G5x7y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y3[0]),
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G5x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6G5x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI6G5x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y3[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y3[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y3[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y3[] = {
  {&(_ZTV6G5x7y3[6]),  6,21},
  {&(_ZTV6G5x7y3[10]),  10,21},
  {&(_ZTV6G5x7y3[13]),  13,21},
  {&(_ZTV6G5x7y3[16]),  16,21},
  {&(_ZTV6G5x7y3[20]),  20,21},
  {&(_tg__ZTV4E5x7__6G5x7y3[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y3[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x7y3[];
extern  VTBL_ENTRY _ZTV6G5x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y3[];
Class_Descriptor cd_G5x7y3 = {  "G5x7y3", // class name
  bases_G5x7y3, 6,
  &(vtc_G5x7y3[0]), // expected_vtbl_contents
  &(vtt_G5x7y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI6G5x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y4  : E5x7 , F0 {
  int ff;
  ~G5x7y4(); // tgen
  G5x7y4(); // tgen
};
//SIG(1 G5x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G5x7y4 ::~G5x7y4(){ note_dtor("G5x7y4", this);} // tgen
G5x7y4 ::G5x7y4(){ note_ctor("G5x7y4", this);} // tgen

static void Test_G5x7y4()
{
  extern Class_Descriptor cd_G5x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G5x7y4, buf);
    G5x7y4 *dp, &lv = *(dp=new (buf) G5x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G5x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y4)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(24,16), "G5x7y4");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(40,24), "G5x7y4");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(24,16), "G5x7y4");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(56,36), "G5x7y4");
    check_base_class_offset(lv, (E5x7*), 0, "G5x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G5x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G5x7y4.ff");
    test_class_info(&lv, &cd_G5x7y4);
    dp->~G5x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y4(Test_G5x7y4, "G5x7y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G5x7y4C1Ev();
extern void _ZN6G5x7y4D1Ev();
Name_Map name_map_G5x7y4[] = {
  NSPAIR(_ZN6G5x7y4C1Ev),
  NSPAIR(_ZN6G5x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G5x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI6G5x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y4[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y4[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y4[] = {
  {&(_ZTV6G5x7y4[4]),  4,11},
  {&(_tg__ZTV4E5x7__6G5x7y4[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y4[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y4[2]),  2,3},
  {&(_ZTV6G5x7y4[7]),  7,11},
  {&(_ZTV6G5x7y4[10]),  10,11},
};
extern VTBL_ENTRY _ZTI6G5x7y4[];
extern  VTBL_ENTRY _ZTV6G5x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y4[];
Class_Descriptor cd_G5x7y4 = {  "G5x7y4", // class name
  bases_G5x7y4, 6,
  &(vtc_G5x7y4[0]), // expected_vtbl_contents
  &(vtt_G5x7y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G5x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y4),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y5  : virtual E5x7 , F0 {
  int ff;
  ~G5x7y5(); // tgen
  G5x7y5(); // tgen
};
//SIG(1 G5x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G5x7y5 ::~G5x7y5(){ note_dtor("G5x7y5", this);} // tgen
G5x7y5 ::G5x7y5(){ note_ctor("G5x7y5", this);} // tgen

static void Test_G5x7y5()
{
  extern Class_Descriptor cd_G5x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x7y5, buf);
    G5x7y5 *dp, &lv = *(dp=new (buf) G5x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y5)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,20), "G5x7y5");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,28), "G5x7y5");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(32,20), "G5x7y5");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(64,40), "G5x7y5");
    check_base_class_offset(lv, (E5x7*), ABISELECT(16,12), "G5x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G5x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x7y5.ff");
    test_class_info(&lv, &cd_G5x7y5);
    dp->~G5x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y5(Test_G5x7y5, "G5x7y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x7y5C1Ev();
extern void _ZN6G5x7y5D1Ev();
Name_Map name_map_G5x7y5[] = {
  NSPAIR(_ZN6G5x7y5C1Ev),
  NSPAIR(_ZN6G5x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    13, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x7y5[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y5[0]),
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G5x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y5[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y5[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y5[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y5[] = {
  {&(_ZTV6G5x7y5[5]),  5,16},
  {&(_ZTV6G5x7y5[9]),  9,16},
  {&(_ZTV6G5x7y5[12]),  12,16},
  {&(_ZTV6G5x7y5[15]),  15,16},
  {&(_tg__ZTV4E5x7__6G5x7y5[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y5[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x7y5[];
extern  VTBL_ENTRY _ZTV6G5x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y5[];
Class_Descriptor cd_G5x7y5 = {  "G5x7y5", // class name
  bases_G5x7y5, 6,
  &(vtc_G5x7y5[0]), // expected_vtbl_contents
  &(vtt_G5x7y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y6  : E5x7 , virtual F0 {
  int ff;
  ~G5x7y6(); // tgen
  G5x7y6(); // tgen
};
//SIG(1 G5x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x7y6 ::~G5x7y6(){ note_dtor("G5x7y6", this);} // tgen
G5x7y6 ::G5x7y6(){ note_ctor("G5x7y6", this);} // tgen

static void Test_G5x7y6()
{
  extern Class_Descriptor cd_G5x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G5x7y6, buf);
    G5x7y6 *dp, &lv = *(dp=new (buf) G5x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G5x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y6)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(16,12), "G5x7y6");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(32,20), "G5x7y6");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(16,12), "G5x7y6");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(48,32), "G5x7y6");
    check_base_class_offset(lv, (E5x7*), 0, "G5x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G5x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G5x7y6.ff");
    test_class_info(&lv, &cd_G5x7y6);
    dp->~G5x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y6(Test_G5x7y6, "G5x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G5x7y6C1Ev();
extern void _ZN6G5x7y6D1Ev();
Name_Map name_map_G5x7y6[] = {
  NSPAIR(_ZN6G5x7y6C1Ev),
  NSPAIR(_ZN6G5x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x7y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G5x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G5x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y6[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y6[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y6[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y6[] = {
  {&(_ZTV6G5x7y6[5]),  5,12},
  {&(_tg__ZTV4E5x7__6G5x7y6[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y6[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y6[2]),  2,3},
  {&(_ZTV6G5x7y6[8]),  8,12},
  {&(_ZTV6G5x7y6[11]),  11,12},
};
extern VTBL_ENTRY _ZTI6G5x7y6[];
extern  VTBL_ENTRY _ZTV6G5x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y6[];
Class_Descriptor cd_G5x7y6 = {  "G5x7y6", // class name
  bases_G5x7y6, 6,
  &(vtc_G5x7y6[0]), // expected_vtbl_contents
  &(vtt_G5x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G5x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y6),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G5x7y7  : virtual E5x7 , virtual F0 {
  int ff;
  ~G5x7y7(); // tgen
  G5x7y7(); // tgen
};
//SIG(1 G5x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G5x7y7 ::~G5x7y7(){ note_dtor("G5x7y7", this);} // tgen
G5x7y7 ::G5x7y7(){ note_ctor("G5x7y7", this);} // tgen

static void Test_G5x7y7()
{
  extern Class_Descriptor cd_G5x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G5x7y7, buf);
    G5x7y7 *dp, &lv = *(dp=new (buf) G5x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G5x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G5x7y7)");
    check_base_class_offset(lv, (A1*)(C5*), ABISELECT(32,16), "G5x7y7");
    check_base_class_offset(lv, (B1*)(C5*), ABISELECT(48,24), "G5x7y7");
    check_base_class_offset(lv, (C5*)(E5x7*), ABISELECT(32,16), "G5x7y7");
    check_base_class_offset(lv, (D0*)(E5x7*), ABISELECT(64,36), "G5x7y7");
    check_base_class_offset(lv, (E5x7*), ABISELECT(16,8), "G5x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G5x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G5x7y7.ff");
    test_class_info(&lv, &cd_G5x7y7);
    dp->~G5x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG5x7y7(Test_G5x7y7, "G5x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G5x7y7C1Ev();
extern void _ZN6G5x7y7D1Ev();
Name_Map name_map_G5x7y7[] = {
  NSPAIR(_ZN6G5x7y7C1Ev),
  NSPAIR(_ZN6G5x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C5;
extern VTBL_ENTRY _ZTI2C5[];
extern  VTBL_ENTRY _ZTV2C5[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E5x7;
extern VTBL_ENTRY _ZTI4E5x7[];
extern  VTBL_ENTRY _ZTV4E5x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E5x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G5x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C5,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E5x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G5x7y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G5x7y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G5x7y7[0]),
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G5x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G5x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI6G5x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G5x7y7[];
static  VTBL_ENTRY _tg__ZTV4E5x7__6G5x7y7[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A12C5__4E5x7__6G5x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B12C5__4E5x7__6G5x7y7[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI4E5x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G5x7y7[] = {
  {&(_ZTV6G5x7y7[6]),  6,17},
  {&(_ZTV6G5x7y7[10]),  10,17},
  {&(_ZTV6G5x7y7[13]),  13,17},
  {&(_ZTV6G5x7y7[16]),  16,17},
  {&(_tg__ZTV4E5x7__6G5x7y7[4]),  4,4},
  {&(_tg__ZTV2A12C5__4E5x7__6G5x7y7[3]),  3,4},
  {&(_tg__ZTV2B12C5__4E5x7__6G5x7y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI6G5x7y7[];
extern  VTBL_ENTRY _ZTV6G5x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G5x7y7[];
Class_Descriptor cd_G5x7y7 = {  "G5x7y7", // class name
  bases_G5x7y7, 6,
  &(vtc_G5x7y7[0]), // expected_vtbl_contents
  &(vtt_G5x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G5x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G5x7y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G5x7y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E6x7  : virtual C6 , virtual D0 {
  int fd;
  ~E6x7(); // tgen
  E6x7(); // tgen
};
//SIG(-1 E6x7) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E6x7 ::~E6x7(){ note_dtor("E6x7", this);} // tgen
E6x7 ::E6x7(){ note_ctor("E6x7", this);} // tgen

static void Test_E6x7()
{
  extern Class_Descriptor cd_E6x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E6x7, buf);
    E6x7 *dp, &lv = *(dp=new (buf) E6x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E6x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E6x7)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,20), "E6x7");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,8), "E6x7");
    check_base_class_offset(lv, (C6*), ABISELECT(16,8), "E6x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E6x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E6x7.fd");
    test_class_info(&lv, &cd_E6x7);
    dp->~E6x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE6x7(Test_E6x7, "E6x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E6x7C1Ev();
extern void _ZN4E6x7D1Ev();
Name_Map name_map_E6x7[] = {
  NSPAIR(_ZN4E6x7C1Ev),
  NSPAIR(_ZN4E6x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E6x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E6x7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E6x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV4E6x7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E6x7[] = {
  {&(_ZTV4E6x7[5]),  5,10},
  {&(_ZTV4E6x7[9]),  9,10},
  {&(_tg__ZTV2C6__4E6x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
Class_Descriptor cd_E6x7 = {  "E6x7", // class name
  bases_E6x7, 4,
  &(vtc_E6x7[0]), // expected_vtbl_contents
  &(vtt_E6x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E6x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E6x7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E6x7),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y0  : E6x7 , F1 {
  int ff;
  ~G6x7y0(); // tgen
  G6x7y0(); // tgen
};
//SIG(1 G6x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x7y0 ::~G6x7y0(){ note_dtor("G6x7y0", this);} // tgen
G6x7y0 ::G6x7y0(){ note_ctor("G6x7y0", this);} // tgen

static void Test_G6x7y0()
{
  extern Class_Descriptor cd_G6x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x7y0, buf);
    G6x7y0 *dp, &lv = *(dp=new (buf) G6x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y0)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x7y0");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x7y0");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(32,20), "G6x7y0");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(52,36), "G6x7y0");
    check_base_class_offset(lv, (E6x7*), 0, "G6x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G6x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G6x7y0.ff");
    test_class_info(&lv, &cd_G6x7y0);
    dp->~G6x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y0(Test_G6x7y0, "G6x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x7y0C1Ev();
extern void _ZN6G6x7y0D1Ev();
Name_Map name_map_G6x7y0[] = {
  NSPAIR(_ZN6G6x7y0C1Ev),
  NSPAIR(_ZN6G6x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G6x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y0[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y0[] = {
  {&(_ZTV6G6x7y0[5]),  5,13},
  {&(_tg__ZTV4E6x7__6G6x7y0[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y0[4]),  4,5},
  {&(_ZTV6G6x7y0[12]),  12,13},
  {&(_tg__ZTV2C6__6G6x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y0[];
extern  VTBL_ENTRY _ZTV6G6x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y0[];
Class_Descriptor cd_G6x7y0 = {  "G6x7y0", // class name
  bases_G6x7y0, 6,
  &(vtc_G6x7y0[0]), // expected_vtbl_contents
  &(vtt_G6x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y1  : virtual E6x7 , F1 {
  int ff;
  ~G6x7y1(); // tgen
  G6x7y1(); // tgen
};
//SIG(1 G6x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G6x7y1 ::~G6x7y1(){ note_dtor("G6x7y1", this);} // tgen
G6x7y1 ::G6x7y1(){ note_ctor("G6x7y1", this);} // tgen

static void Test_G6x7y1()
{
  extern Class_Descriptor cd_G6x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x7y1, buf);
    G6x7y1 *dp, &lv = *(dp=new (buf) G6x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y1)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x7y1");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x7y1");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(32,20), "G6x7y1");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(52,36), "G6x7y1");
    check_base_class_offset(lv, (E6x7*), ABISELECT(16,12), "G6x7y1");
    check_base_class_offset(lv, (F1*), 0, "G6x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x7y1.ff");
    test_class_info(&lv, &cd_G6x7y1);
    dp->~G6x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y1(Test_G6x7y1, "G6x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x7y1C1Ev();
extern void _ZN6G6x7y1D1Ev();
Name_Map name_map_G6x7y1[] = {
  NSPAIR(_ZN6G6x7y1C1Ev),
  NSPAIR(_ZN6G6x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G6x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y1[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y1[] = {
  {&(_ZTV6G6x7y1[6]),  6,17},
  {&(_ZTV6G6x7y1[12]),  12,17},
  {&(_ZTV6G6x7y1[16]),  16,17},
  {&(_tg__ZTV4E6x7__6G6x7y1[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y1[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y1[];
extern  VTBL_ENTRY _ZTV6G6x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y1[];
Class_Descriptor cd_G6x7y1 = {  "G6x7y1", // class name
  bases_G6x7y1, 6,
  &(vtc_G6x7y1[0]), // expected_vtbl_contents
  &(vtt_G6x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y2  : E6x7 , virtual F1 {
  int ff;
  ~G6x7y2(); // tgen
  G6x7y2(); // tgen
};
//SIG(1 G6x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x7y2 ::~G6x7y2(){ note_dtor("G6x7y2", this);} // tgen
G6x7y2 ::G6x7y2(){ note_ctor("G6x7y2", this);} // tgen

static void Test_G6x7y2()
{
  extern Class_Descriptor cd_G6x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x7y2, buf);
    G6x7y2 *dp, &lv = *(dp=new (buf) G6x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y2)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,24), "G6x7y2");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,12), "G6x7y2");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(16,12), "G6x7y2");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(36,28), "G6x7y2");
    check_base_class_offset(lv, (E6x7*), 0, "G6x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G6x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x7y2.ff");
    test_class_info(&lv, &cd_G6x7y2);
    dp->~G6x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y2(Test_G6x7y2, "G6x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x7y2C1Ev();
extern void _ZN6G6x7y2D1Ev();
Name_Map name_map_G6x7y2[] = {
  NSPAIR(_ZN6G6x7y2C1Ev),
  NSPAIR(_ZN6G6x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G6x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y2[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y2[] = {
  {&(_ZTV6G6x7y2[6]),  6,15},
  {&(_tg__ZTV4E6x7__6G6x7y2[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y2[4]),  4,5},
  {&(_ZTV6G6x7y2[10]),  10,15},
  {&(_ZTV6G6x7y2[14]),  14,15},
  {&(_tg__ZTV2C6__6G6x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y2[];
extern  VTBL_ENTRY _ZTV6G6x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y2[];
Class_Descriptor cd_G6x7y2 = {  "G6x7y2", // class name
  bases_G6x7y2, 6,
  &(vtc_G6x7y2[0]), // expected_vtbl_contents
  &(vtt_G6x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y3  : virtual E6x7 , virtual F1 {
  int ff;
  ~G6x7y3(); // tgen
  G6x7y3(); // tgen
};
//SIG(1 G6x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G6x7y3 ::~G6x7y3(){ note_dtor("G6x7y3", this);} // tgen
G6x7y3 ::G6x7y3(){ note_ctor("G6x7y3", this);} // tgen

static void Test_G6x7y3()
{
  extern Class_Descriptor cd_G6x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G6x7y3, buf);
    G6x7y3 *dp, &lv = *(dp=new (buf) G6x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G6x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y3)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,28), "G6x7y3");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,16), "G6x7y3");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(32,16), "G6x7y3");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(52,32), "G6x7y3");
    check_base_class_offset(lv, (E6x7*), ABISELECT(16,8), "G6x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G6x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x7y3.ff");
    test_class_info(&lv, &cd_G6x7y3);
    dp->~G6x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y3(Test_G6x7y3, "G6x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G6x7y3C1Ev();
extern void _ZN6G6x7y3D1Ev();
Name_Map name_map_G6x7y3[] = {
  NSPAIR(_ZN6G6x7y3C1Ev),
  NSPAIR(_ZN6G6x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G6x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G6x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G6x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G6x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y3[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y3[] = {
  {&(_ZTV6G6x7y3[7]),  7,21},
  {&(_ZTV6G6x7y3[12]),  12,21},
  {&(_ZTV6G6x7y3[16]),  16,21},
  {&(_ZTV6G6x7y3[20]),  20,21},
  {&(_tg__ZTV4E6x7__6G6x7y3[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y3[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y3[];
extern  VTBL_ENTRY _ZTV6G6x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y3[];
Class_Descriptor cd_G6x7y3 = {  "G6x7y3", // class name
  bases_G6x7y3, 6,
  &(vtc_G6x7y3[0]), // expected_vtbl_contents
  &(vtt_G6x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G6x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y4  : E6x7 , F0 {
  int ff;
  ~G6x7y4(); // tgen
  G6x7y4(); // tgen
};
//SIG(1 G6x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G6x7y4 ::~G6x7y4(){ note_dtor("G6x7y4", this);} // tgen
G6x7y4 ::G6x7y4(){ note_ctor("G6x7y4", this);} // tgen

static void Test_G6x7y4()
{
  extern Class_Descriptor cd_G6x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x7y4, buf);
    G6x7y4 *dp, &lv = *(dp=new (buf) G6x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y4)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(40,28), "G6x7y4");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(24,16), "G6x7y4");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(24,16), "G6x7y4");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(44,32), "G6x7y4");
    check_base_class_offset(lv, (E6x7*), 0, "G6x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G6x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G6x7y4.ff");
    test_class_info(&lv, &cd_G6x7y4);
    dp->~G6x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y4(Test_G6x7y4, "G6x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x7y4C1Ev();
extern void _ZN6G6x7y4D1Ev();
Name_Map name_map_G6x7y4[] = {
  NSPAIR(_ZN6G6x7y4C1Ev),
  NSPAIR(_ZN6G6x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G6x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y4[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y4[] = {
  {&(_ZTV6G6x7y4[5]),  5,10},
  {&(_tg__ZTV4E6x7__6G6x7y4[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y4[4]),  4,5},
  {&(_ZTV6G6x7y4[9]),  9,10},
  {&(_tg__ZTV2C6__6G6x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y4[];
extern  VTBL_ENTRY _ZTV6G6x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y4[];
Class_Descriptor cd_G6x7y4 = {  "G6x7y4", // class name
  bases_G6x7y4, 6,
  &(vtc_G6x7y4[0]), // expected_vtbl_contents
  &(vtt_G6x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y5  : virtual E6x7 , F0 {
  int ff;
  ~G6x7y5(); // tgen
  G6x7y5(); // tgen
};
//SIG(1 G6x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G6x7y5 ::~G6x7y5(){ note_dtor("G6x7y5", this);} // tgen
G6x7y5 ::G6x7y5(){ note_ctor("G6x7y5", this);} // tgen

static void Test_G6x7y5()
{
  extern Class_Descriptor cd_G6x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G6x7y5, buf);
    G6x7y5 *dp, &lv = *(dp=new (buf) G6x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G6x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y5)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,32), "G6x7y5");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,20), "G6x7y5");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(32,20), "G6x7y5");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(52,36), "G6x7y5");
    check_base_class_offset(lv, (E6x7*), ABISELECT(16,12), "G6x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G6x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x7y5.ff");
    test_class_info(&lv, &cd_G6x7y5);
    dp->~G6x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y5(Test_G6x7y5, "G6x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G6x7y5C1Ev();
extern void _ZN6G6x7y5D1Ev();
Name_Map name_map_G6x7y5[] = {
  NSPAIR(_ZN6G6x7y5C1Ev),
  NSPAIR(_ZN6G6x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G6x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y5[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y5[] = {
  {&(_ZTV6G6x7y5[6]),  6,16},
  {&(_ZTV6G6x7y5[11]),  11,16},
  {&(_ZTV6G6x7y5[15]),  15,16},
  {&(_tg__ZTV4E6x7__6G6x7y5[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y5[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y5[];
extern  VTBL_ENTRY _ZTV6G6x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y5[];
Class_Descriptor cd_G6x7y5 = {  "G6x7y5", // class name
  bases_G6x7y5, 6,
  &(vtc_G6x7y5[0]), // expected_vtbl_contents
  &(vtt_G6x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G6x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y6  : E6x7 , virtual F0 {
  int ff;
  ~G6x7y6(); // tgen
  G6x7y6(); // tgen
};
//SIG(1 G6x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x7y6 ::~G6x7y6(){ note_dtor("G6x7y6", this);} // tgen
G6x7y6 ::G6x7y6(){ note_ctor("G6x7y6", this);} // tgen

static void Test_G6x7y6()
{
  extern Class_Descriptor cd_G6x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G6x7y6, buf);
    G6x7y6 *dp, &lv = *(dp=new (buf) G6x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G6x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y6)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(32,24), "G6x7y6");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(16,12), "G6x7y6");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(16,12), "G6x7y6");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(36,28), "G6x7y6");
    check_base_class_offset(lv, (E6x7*), 0, "G6x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G6x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G6x7y6.ff");
    test_class_info(&lv, &cd_G6x7y6);
    dp->~G6x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y6(Test_G6x7y6, "G6x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G6x7y6C1Ev();
extern void _ZN6G6x7y6D1Ev();
Name_Map name_map_G6x7y6[] = {
  NSPAIR(_ZN6G6x7y6C1Ev),
  NSPAIR(_ZN6G6x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G6x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y6[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y6[] = {
  {&(_ZTV6G6x7y6[6]),  6,11},
  {&(_tg__ZTV4E6x7__6G6x7y6[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y6[4]),  4,5},
  {&(_ZTV6G6x7y6[10]),  10,11},
  {&(_tg__ZTV2C6__6G6x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y6[];
extern  VTBL_ENTRY _ZTV6G6x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y6[];
Class_Descriptor cd_G6x7y6 = {  "G6x7y6", // class name
  bases_G6x7y6, 6,
  &(vtc_G6x7y6[0]), // expected_vtbl_contents
  &(vtt_G6x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G6x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G6x7y7  : virtual E6x7 , virtual F0 {
  int ff;
  ~G6x7y7(); // tgen
  G6x7y7(); // tgen
};
//SIG(1 G6x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G6x7y7 ::~G6x7y7(){ note_dtor("G6x7y7", this);} // tgen
G6x7y7 ::G6x7y7(){ note_ctor("G6x7y7", this);} // tgen

static void Test_G6x7y7()
{
  extern Class_Descriptor cd_G6x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G6x7y7, buf);
    G6x7y7 *dp, &lv = *(dp=new (buf) G6x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G6x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G6x7y7)");
    check_base_class_offset(lv, (A0*)(C6*), ABISELECT(48,28), "G6x7y7");
    check_base_class_offset(lv, (B1*)(C6*), ABISELECT(32,16), "G6x7y7");
    check_base_class_offset(lv, (C6*)(E6x7*), ABISELECT(32,16), "G6x7y7");
    check_base_class_offset(lv, (D0*)(E6x7*), ABISELECT(52,32), "G6x7y7");
    check_base_class_offset(lv, (E6x7*), ABISELECT(16,8), "G6x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G6x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G6x7y7.ff");
    test_class_info(&lv, &cd_G6x7y7);
    dp->~G6x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG6x7y7(Test_G6x7y7, "G6x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G6x7y7C1Ev();
extern void _ZN6G6x7y7D1Ev();
Name_Map name_map_G6x7y7[] = {
  NSPAIR(_ZN6G6x7y7C1Ev),
  NSPAIR(_ZN6G6x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C6;
extern VTBL_ENTRY _ZTI2C6[];
extern  VTBL_ENTRY _ZTV2C6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C6[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E6x7;
extern VTBL_ENTRY _ZTI4E6x7[];
extern  VTBL_ENTRY _ZTV4E6x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E6x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G6x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C6,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E6x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G6x7y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G6x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G6x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G6x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G6x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV6G6x7y7[];
static  VTBL_ENTRY _tg__ZTV4E6x7__6G6x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__4E6x7__6G6x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E6x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C6__6G6x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G6x7y7[] = {
  {&(_ZTV6G6x7y7[7]),  7,17},
  {&(_ZTV6G6x7y7[12]),  12,17},
  {&(_ZTV6G6x7y7[16]),  16,17},
  {&(_tg__ZTV4E6x7__6G6x7y7[5]),  5,5},
  {&(_tg__ZTV2C6__4E6x7__6G6x7y7[4]),  4,5},
  {&(_tg__ZTV2C6__6G6x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G6x7y7[];
extern  VTBL_ENTRY _ZTV6G6x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G6x7y7[];
Class_Descriptor cd_G6x7y7 = {  "G6x7y7", // class name
  bases_G6x7y7, 6,
  &(vtc_G6x7y7[0]), // expected_vtbl_contents
  &(vtt_G6x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G6x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G6x7y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G6x7y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E7x7  : virtual C7 , virtual D0 {
  int fd;
  ~E7x7(); // tgen
  E7x7(); // tgen
};
//SIG(-1 E7x7) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E7x7 ::~E7x7(){ note_dtor("E7x7", this);} // tgen
E7x7 ::E7x7(){ note_ctor("E7x7", this);} // tgen

static void Test_E7x7()
{
  extern Class_Descriptor cd_E7x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E7x7, buf);
    E7x7 *dp, &lv = *(dp=new (buf) E7x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E7x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E7x7)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,20), "E7x7");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,8), "E7x7");
    check_base_class_offset(lv, (C7*), ABISELECT(16,8), "E7x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E7x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E7x7.fd");
    test_class_info(&lv, &cd_E7x7);
    dp->~E7x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE7x7(Test_E7x7, "E7x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN4E7x7C1Ev();
extern void _ZN4E7x7D1Ev();
Name_Map name_map_E7x7[] = {
  NSPAIR(_ZN4E7x7C1Ev),
  NSPAIR(_ZN4E7x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E7x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E7x7[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E7x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E7x7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__4E7x7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E7x7[] = {
  {&(_ZTV4E7x7[5]),  5,14},
  {&(_ZTV4E7x7[9]),  9,14},
  {&(_ZTV4E7x7[13]),  13,14},
  {&(_tg__ZTV2C7__4E7x7[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__4E7x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
Class_Descriptor cd_E7x7 = {  "E7x7", // class name
  bases_E7x7, 4,
  &(vtc_E7x7[0]), // expected_vtbl_contents
  &(vtt_E7x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI4E7x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E7x7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E7x7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y0  : E7x7 , F1 {
  int ff;
  ~G7x7y0(); // tgen
  G7x7y0(); // tgen
};
//SIG(1 G7x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x7y0 ::~G7x7y0(){ note_dtor("G7x7y0", this);} // tgen
G7x7y0 ::G7x7y0(){ note_ctor("G7x7y0", this);} // tgen

static void Test_G7x7y0()
{
  extern Class_Descriptor cd_G7x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x7y0, buf);
    G7x7y0 *dp, &lv = *(dp=new (buf) G7x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y0)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x7y0");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x7y0");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(32,20), "G7x7y0");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(60,40), "G7x7y0");
    check_base_class_offset(lv, (E7x7*), 0, "G7x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G7x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G7x7y0.ff");
    test_class_info(&lv, &cd_G7x7y0);
    dp->~G7x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y0(Test_G7x7y0, "G7x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x7y0C1Ev();
extern void _ZN6G7x7y0D1Ev();
Name_Map name_map_G7x7y0[] = {
  NSPAIR(_ZN6G7x7y0C1Ev),
  NSPAIR(_ZN6G7x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G7x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G7x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y0[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y0[] = {
  {&(_ZTV6G7x7y0[5]),  5,17},
  {&(_tg__ZTV4E7x7__6G7x7y0[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y0[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y0[3]),  3,4},
  {&(_ZTV6G7x7y0[12]),  12,17},
  {&(_ZTV6G7x7y0[16]),  16,17},
  {&(_tg__ZTV2C7__6G7x7y0[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y0[];
extern  VTBL_ENTRY _ZTV6G7x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y0[];
Class_Descriptor cd_G7x7y0 = {  "G7x7y0", // class name
  bases_G7x7y0, 6,
  &(vtc_G7x7y0[0]), // expected_vtbl_contents
  &(vtt_G7x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y1  : virtual E7x7 , F1 {
  int ff;
  ~G7x7y1(); // tgen
  G7x7y1(); // tgen
};
//SIG(1 G7x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G7x7y1 ::~G7x7y1(){ note_dtor("G7x7y1", this);} // tgen
G7x7y1 ::G7x7y1(){ note_ctor("G7x7y1", this);} // tgen

static void Test_G7x7y1()
{
  extern Class_Descriptor cd_G7x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x7y1, buf);
    G7x7y1 *dp, &lv = *(dp=new (buf) G7x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y1)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x7y1");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x7y1");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(32,20), "G7x7y1");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(60,40), "G7x7y1");
    check_base_class_offset(lv, (E7x7*), ABISELECT(16,12), "G7x7y1");
    check_base_class_offset(lv, (F1*), 0, "G7x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x7y1.ff");
    test_class_info(&lv, &cd_G7x7y1);
    dp->~G7x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y1(Test_G7x7y1, "G7x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x7y1C1Ev();
extern void _ZN6G7x7y1D1Ev();
Name_Map name_map_G7x7y1[] = {
  NSPAIR(_ZN6G7x7y1C1Ev),
  NSPAIR(_ZN6G7x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G7x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G7x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y1[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y1[] = {
  {&(_ZTV6G7x7y1[6]),  6,21},
  {&(_ZTV6G7x7y1[12]),  12,21},
  {&(_ZTV6G7x7y1[16]),  16,21},
  {&(_ZTV6G7x7y1[20]),  20,21},
  {&(_tg__ZTV4E7x7__6G7x7y1[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y1[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y1[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x7y1[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y1[];
extern  VTBL_ENTRY _ZTV6G7x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y1[];
Class_Descriptor cd_G7x7y1 = {  "G7x7y1", // class name
  bases_G7x7y1, 6,
  &(vtc_G7x7y1[0]), // expected_vtbl_contents
  &(vtt_G7x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y2  : E7x7 , virtual F1 {
  int ff;
  ~G7x7y2(); // tgen
  G7x7y2(); // tgen
};
//SIG(1 G7x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x7y2 ::~G7x7y2(){ note_dtor("G7x7y2", this);} // tgen
G7x7y2 ::G7x7y2(){ note_ctor("G7x7y2", this);} // tgen

static void Test_G7x7y2()
{
  extern Class_Descriptor cd_G7x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x7y2, buf);
    G7x7y2 *dp, &lv = *(dp=new (buf) G7x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y2)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,24), "G7x7y2");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,12), "G7x7y2");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(16,12), "G7x7y2");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(44,32), "G7x7y2");
    check_base_class_offset(lv, (E7x7*), 0, "G7x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G7x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x7y2.ff");
    test_class_info(&lv, &cd_G7x7y2);
    dp->~G7x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y2(Test_G7x7y2, "G7x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x7y2C1Ev();
extern void _ZN6G7x7y2D1Ev();
Name_Map name_map_G7x7y2[] = {
  NSPAIR(_ZN6G7x7y2C1Ev),
  NSPAIR(_ZN6G7x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y2[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI6G7x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y2[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y2[] = {
  {&(_ZTV6G7x7y2[6]),  6,19},
  {&(_tg__ZTV4E7x7__6G7x7y2[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y2[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y2[3]),  3,4},
  {&(_ZTV6G7x7y2[10]),  10,19},
  {&(_ZTV6G7x7y2[14]),  14,19},
  {&(_ZTV6G7x7y2[18]),  18,19},
  {&(_tg__ZTV2C7__6G7x7y2[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y2[];
extern  VTBL_ENTRY _ZTV6G7x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y2[];
Class_Descriptor cd_G7x7y2 = {  "G7x7y2", // class name
  bases_G7x7y2, 6,
  &(vtc_G7x7y2[0]), // expected_vtbl_contents
  &(vtt_G7x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y3  : virtual E7x7 , virtual F1 {
  int ff;
  ~G7x7y3(); // tgen
  G7x7y3(); // tgen
};
//SIG(1 G7x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G7x7y3 ::~G7x7y3(){ note_dtor("G7x7y3", this);} // tgen
G7x7y3 ::G7x7y3(){ note_ctor("G7x7y3", this);} // tgen

static void Test_G7x7y3()
{
  extern Class_Descriptor cd_G7x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G7x7y3, buf);
    G7x7y3 *dp, &lv = *(dp=new (buf) G7x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G7x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y3)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,28), "G7x7y3");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,16), "G7x7y3");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(32,16), "G7x7y3");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(60,36), "G7x7y3");
    check_base_class_offset(lv, (E7x7*), ABISELECT(16,8), "G7x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G7x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x7y3.ff");
    test_class_info(&lv, &cd_G7x7y3);
    dp->~G7x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y3(Test_G7x7y3, "G7x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN6G7x7y3C1Ev();
extern void _ZN6G7x7y3D1Ev();
Name_Map name_map_G7x7y3[] = {
  NSPAIR(_ZN6G7x7y3C1Ev),
  NSPAIR(_ZN6G7x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G7x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y3[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G7x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G7x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G7x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI6G7x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y3[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y3[] = {
  {&(_ZTV6G7x7y3[7]),  7,25},
  {&(_ZTV6G7x7y3[12]),  12,25},
  {&(_ZTV6G7x7y3[16]),  16,25},
  {&(_ZTV6G7x7y3[20]),  20,25},
  {&(_ZTV6G7x7y3[24]),  24,25},
  {&(_tg__ZTV4E7x7__6G7x7y3[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y3[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y3[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x7y3[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y3[];
extern  VTBL_ENTRY _ZTV6G7x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y3[];
Class_Descriptor cd_G7x7y3 = {  "G7x7y3", // class name
  bases_G7x7y3, 6,
  &(vtc_G7x7y3[0]), // expected_vtbl_contents
  &(vtt_G7x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI6G7x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y4  : E7x7 , F0 {
  int ff;
  ~G7x7y4(); // tgen
  G7x7y4(); // tgen
};
//SIG(1 G7x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G7x7y4 ::~G7x7y4(){ note_dtor("G7x7y4", this);} // tgen
G7x7y4 ::G7x7y4(){ note_ctor("G7x7y4", this);} // tgen

static void Test_G7x7y4()
{
  extern Class_Descriptor cd_G7x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x7y4, buf);
    G7x7y4 *dp, &lv = *(dp=new (buf) G7x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y4)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(40,28), "G7x7y4");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(24,16), "G7x7y4");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(24,16), "G7x7y4");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(52,36), "G7x7y4");
    check_base_class_offset(lv, (E7x7*), 0, "G7x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G7x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G7x7y4.ff");
    test_class_info(&lv, &cd_G7x7y4);
    dp->~G7x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y4(Test_G7x7y4, "G7x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x7y4C1Ev();
extern void _ZN6G7x7y4D1Ev();
Name_Map name_map_G7x7y4[] = {
  NSPAIR(_ZN6G7x7y4C1Ev),
  NSPAIR(_ZN6G7x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y4[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G7x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI6G7x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y4[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y4[] = {
  {&(_ZTV6G7x7y4[5]),  5,14},
  {&(_tg__ZTV4E7x7__6G7x7y4[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y4[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y4[3]),  3,4},
  {&(_ZTV6G7x7y4[9]),  9,14},
  {&(_ZTV6G7x7y4[13]),  13,14},
  {&(_tg__ZTV2C7__6G7x7y4[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y4[];
extern  VTBL_ENTRY _ZTV6G7x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y4[];
Class_Descriptor cd_G7x7y4 = {  "G7x7y4", // class name
  bases_G7x7y4, 6,
  &(vtc_G7x7y4[0]), // expected_vtbl_contents
  &(vtt_G7x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y5  : virtual E7x7 , F0 {
  int ff;
  ~G7x7y5(); // tgen
  G7x7y5(); // tgen
};
//SIG(1 G7x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G7x7y5 ::~G7x7y5(){ note_dtor("G7x7y5", this);} // tgen
G7x7y5 ::G7x7y5(){ note_ctor("G7x7y5", this);} // tgen

static void Test_G7x7y5()
{
  extern Class_Descriptor cd_G7x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G7x7y5, buf);
    G7x7y5 *dp, &lv = *(dp=new (buf) G7x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G7x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y5)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,32), "G7x7y5");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,20), "G7x7y5");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(32,20), "G7x7y5");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(60,40), "G7x7y5");
    check_base_class_offset(lv, (E7x7*), ABISELECT(16,12), "G7x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G7x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x7y5.ff");
    test_class_info(&lv, &cd_G7x7y5);
    dp->~G7x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y5(Test_G7x7y5, "G7x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN6G7x7y5C1Ev();
extern void _ZN6G7x7y5D1Ev();
Name_Map name_map_G7x7y5[] = {
  NSPAIR(_ZN6G7x7y5C1Ev),
  NSPAIR(_ZN6G7x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y5[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G7x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI6G7x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y5[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y5[] = {
  {&(_ZTV6G7x7y5[6]),  6,20},
  {&(_ZTV6G7x7y5[11]),  11,20},
  {&(_ZTV6G7x7y5[15]),  15,20},
  {&(_ZTV6G7x7y5[19]),  19,20},
  {&(_tg__ZTV4E7x7__6G7x7y5[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y5[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y5[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x7y5[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y5[];
extern  VTBL_ENTRY _ZTV6G7x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y5[];
Class_Descriptor cd_G7x7y5 = {  "G7x7y5", // class name
  bases_G7x7y5, 6,
  &(vtc_G7x7y5[0]), // expected_vtbl_contents
  &(vtt_G7x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI6G7x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y6  : E7x7 , virtual F0 {
  int ff;
  ~G7x7y6(); // tgen
  G7x7y6(); // tgen
};
//SIG(1 G7x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x7y6 ::~G7x7y6(){ note_dtor("G7x7y6", this);} // tgen
G7x7y6 ::G7x7y6(){ note_ctor("G7x7y6", this);} // tgen

static void Test_G7x7y6()
{
  extern Class_Descriptor cd_G7x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G7x7y6, buf);
    G7x7y6 *dp, &lv = *(dp=new (buf) G7x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G7x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y6)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(32,24), "G7x7y6");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(16,12), "G7x7y6");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(16,12), "G7x7y6");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(44,32), "G7x7y6");
    check_base_class_offset(lv, (E7x7*), 0, "G7x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G7x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G7x7y6.ff");
    test_class_info(&lv, &cd_G7x7y6);
    dp->~G7x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y6(Test_G7x7y6, "G7x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G7x7y6C1Ev();
extern void _ZN6G7x7y6D1Ev();
Name_Map name_map_G7x7y6[] = {
  NSPAIR(_ZN6G7x7y6C1Ev),
  NSPAIR(_ZN6G7x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y6[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G7x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI6G7x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y6[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y6[] = {
  {&(_ZTV6G7x7y6[6]),  6,15},
  {&(_tg__ZTV4E7x7__6G7x7y6[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y6[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y6[3]),  3,4},
  {&(_ZTV6G7x7y6[10]),  10,15},
  {&(_ZTV6G7x7y6[14]),  14,15},
  {&(_tg__ZTV2C7__6G7x7y6[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y6[];
extern  VTBL_ENTRY _ZTV6G7x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y6[];
Class_Descriptor cd_G7x7y6 = {  "G7x7y6", // class name
  bases_G7x7y6, 6,
  &(vtc_G7x7y6[0]), // expected_vtbl_contents
  &(vtt_G7x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G7x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G7x7y7  : virtual E7x7 , virtual F0 {
  int ff;
  ~G7x7y7(); // tgen
  G7x7y7(); // tgen
};
//SIG(1 G7x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G7x7y7 ::~G7x7y7(){ note_dtor("G7x7y7", this);} // tgen
G7x7y7 ::G7x7y7(){ note_ctor("G7x7y7", this);} // tgen

static void Test_G7x7y7()
{
  extern Class_Descriptor cd_G7x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G7x7y7, buf);
    G7x7y7 *dp, &lv = *(dp=new (buf) G7x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G7x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G7x7y7)");
    check_base_class_offset(lv, (A1*)(C7*), ABISELECT(48,28), "G7x7y7");
    check_base_class_offset(lv, (B1*)(C7*), ABISELECT(32,16), "G7x7y7");
    check_base_class_offset(lv, (C7*)(E7x7*), ABISELECT(32,16), "G7x7y7");
    check_base_class_offset(lv, (D0*)(E7x7*), ABISELECT(60,36), "G7x7y7");
    check_base_class_offset(lv, (E7x7*), ABISELECT(16,8), "G7x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G7x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G7x7y7.ff");
    test_class_info(&lv, &cd_G7x7y7);
    dp->~G7x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG7x7y7(Test_G7x7y7, "G7x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G7x7y7C1Ev();
extern void _ZN6G7x7y7D1Ev();
Name_Map name_map_G7x7y7[] = {
  NSPAIR(_ZN6G7x7y7C1Ev),
  NSPAIR(_ZN6G7x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C7;
extern VTBL_ENTRY _ZTI2C7[];
extern  VTBL_ENTRY _ZTV2C7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C7[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E7x7;
extern VTBL_ENTRY _ZTI4E7x7[];
extern  VTBL_ENTRY _ZTV4E7x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E7x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G7x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C7,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E7x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G7x7y7[];
extern void _ZN2B13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G7x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G7x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G7x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G7x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI6G7x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G7x7y7[];
static  VTBL_ENTRY _tg__ZTV4E7x7__6G7x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__4E7x7__6G7x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__4E7x7__6G7x7y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E7x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2C7__6G7x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__2C7__6G7x7y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI2C7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G7x7y7[] = {
  {&(_ZTV6G7x7y7[7]),  7,21},
  {&(_ZTV6G7x7y7[12]),  12,21},
  {&(_ZTV6G7x7y7[16]),  16,21},
  {&(_ZTV6G7x7y7[20]),  20,21},
  {&(_tg__ZTV4E7x7__6G7x7y7[5]),  5,5},
  {&(_tg__ZTV2C7__4E7x7__6G7x7y7[4]),  4,5},
  {&(_tg__ZTV2A1__4E7x7__6G7x7y7[3]),  3,4},
  {&(_tg__ZTV2C7__6G7x7y7[3]),  3,4},
  {&(_tg__ZTV2A1__2C7__6G7x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G7x7y7[];
extern  VTBL_ENTRY _ZTV6G7x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G7x7y7[];
Class_Descriptor cd_G7x7y7 = {  "G7x7y7", // class name
  bases_G7x7y7, 6,
  &(vtc_G7x7y7[0]), // expected_vtbl_contents
  &(vtt_G7x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G7x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G7x7y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G7x7y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E8x7  : virtual C8 , virtual D0 {
  int fd;
  ~E8x7(); // tgen
  E8x7(); // tgen
};
//SIG(-1 E8x7) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E8x7 ::~E8x7(){ note_dtor("E8x7", this);} // tgen
E8x7 ::E8x7(){ note_ctor("E8x7", this);} // tgen

static void Test_E8x7()
{
  extern Class_Descriptor cd_E8x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E8x7, buf);
    E8x7 *dp, &lv = *(dp=new (buf) E8x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E8x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E8x7)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,12), "E8x7");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,20), "E8x7");
    check_base_class_offset(lv, (C8*), ABISELECT(16,8), "E8x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E8x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E8x7.fd");
    test_class_info(&lv, &cd_E8x7);
    dp->~E8x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE8x7(Test_E8x7, "E8x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E8x7C1Ev();
extern void _ZN4E8x7D1Ev();
Name_Map name_map_E8x7[] = {
  NSPAIR(_ZN4E8x7C1Ev),
  NSPAIR(_ZN4E8x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E8x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E8x7[];
static  VTBL_ENTRY vtc_E8x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
extern VTBL_ENTRY _ZTV4E8x7[];
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_E8x7[] = {
  {&(_ZTV4E8x7[5]),  5,8},
  {&(_ZTV4E8x7[8]),  8,8},
  {&(_tg__ZTV2C8__4E8x7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
Class_Descriptor cd_E8x7 = {  "E8x7", // class name
  bases_E8x7, 4,
  &(vtc_E8x7[0]), // expected_vtbl_contents
  &(vtt_E8x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E8x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E8x7),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E8x7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y0  : E8x7 , F1 {
  int ff;
  ~G8x7y0(); // tgen
  G8x7y0(); // tgen
};
//SIG(1 G8x7y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x7y0 ::~G8x7y0(){ note_dtor("G8x7y0", this);} // tgen
G8x7y0 ::G8x7y0(){ note_ctor("G8x7y0", this);} // tgen

static void Test_G8x7y0()
{
  extern Class_Descriptor cd_G8x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x7y0, buf);
    G8x7y0 *dp, &lv = *(dp=new (buf) G8x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y0)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x7y0");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x7y0");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(32,20), "G8x7y0");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(52,36), "G8x7y0");
    check_base_class_offset(lv, (E8x7*), 0, "G8x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G8x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G8x7y0.ff");
    test_class_info(&lv, &cd_G8x7y0);
    dp->~G8x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y0(Test_G8x7y0, "G8x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x7y0C1Ev();
extern void _ZN6G8x7y0D1Ev();
Name_Map name_map_G8x7y0[] = {
  NSPAIR(_ZN6G8x7y0C1Ev),
  NSPAIR(_ZN6G8x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G8x7y0[0]),
};
extern VTBL_ENTRY _ZTV6G8x7y0[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y0[] = {
  {&(_ZTV6G8x7y0[5]),  5,11},
  {&(_tg__ZTV4E8x7__6G8x7y0[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y0[3]),  3,3},
  {&(_ZTV6G8x7y0[11]),  11,11},
  {&(_tg__ZTV2C8__6G8x7y0[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y0[];
extern  VTBL_ENTRY _ZTV6G8x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y0[];
Class_Descriptor cd_G8x7y0 = {  "G8x7y0", // class name
  bases_G8x7y0, 6,
  &(vtc_G8x7y0[0]), // expected_vtbl_contents
  &(vtt_G8x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y0),11, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y1  : virtual E8x7 , F1 {
  int ff;
  ~G8x7y1(); // tgen
  G8x7y1(); // tgen
};
//SIG(1 G8x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G8x7y1 ::~G8x7y1(){ note_dtor("G8x7y1", this);} // tgen
G8x7y1 ::G8x7y1(){ note_ctor("G8x7y1", this);} // tgen

static void Test_G8x7y1()
{
  extern Class_Descriptor cd_G8x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x7y1, buf);
    G8x7y1 *dp, &lv = *(dp=new (buf) G8x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y1)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x7y1");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x7y1");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(32,20), "G8x7y1");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(52,36), "G8x7y1");
    check_base_class_offset(lv, (E8x7*), ABISELECT(16,12), "G8x7y1");
    check_base_class_offset(lv, (F1*), 0, "G8x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x7y1.ff");
    test_class_info(&lv, &cd_G8x7y1);
    dp->~G8x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y1(Test_G8x7y1, "G8x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x7y1C1Ev();
extern void _ZN6G8x7y1D1Ev();
Name_Map name_map_G8x7y1[] = {
  NSPAIR(_ZN6G8x7y1C1Ev),
  NSPAIR(_ZN6G8x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x7y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G8x7y1[0]),
};
extern VTBL_ENTRY _ZTV6G8x7y1[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y1[] = {
  {&(_ZTV6G8x7y1[6]),  6,15},
  {&(_ZTV6G8x7y1[12]),  12,15},
  {&(_ZTV6G8x7y1[15]),  15,15},
  {&(_tg__ZTV4E8x7__6G8x7y1[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y1[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x7y1[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y1[];
extern  VTBL_ENTRY _ZTV6G8x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y1[];
Class_Descriptor cd_G8x7y1 = {  "G8x7y1", // class name
  bases_G8x7y1, 6,
  &(vtc_G8x7y1[0]), // expected_vtbl_contents
  &(vtt_G8x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y1),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y2  : E8x7 , virtual F1 {
  int ff;
  ~G8x7y2(); // tgen
  G8x7y2(); // tgen
};
//SIG(1 G8x7y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x7y2 ::~G8x7y2(){ note_dtor("G8x7y2", this);} // tgen
G8x7y2 ::G8x7y2(){ note_ctor("G8x7y2", this);} // tgen

static void Test_G8x7y2()
{
  extern Class_Descriptor cd_G8x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x7y2, buf);
    G8x7y2 *dp, &lv = *(dp=new (buf) G8x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y2)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,16), "G8x7y2");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,24), "G8x7y2");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(16,12), "G8x7y2");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(36,28), "G8x7y2");
    check_base_class_offset(lv, (E8x7*), 0, "G8x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G8x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x7y2.ff");
    test_class_info(&lv, &cd_G8x7y2);
    dp->~G8x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y2(Test_G8x7y2, "G8x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x7y2C1Ev();
extern void _ZN6G8x7y2D1Ev();
Name_Map name_map_G8x7y2[] = {
  NSPAIR(_ZN6G8x7y2C1Ev),
  NSPAIR(_ZN6G8x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y2[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x7y2[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G8x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x7y2[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y2[] = {
  {&(_ZTV6G8x7y2[6]),  6,13},
  {&(_tg__ZTV4E8x7__6G8x7y2[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y2[3]),  3,3},
  {&(_ZTV6G8x7y2[9]),  9,13},
  {&(_ZTV6G8x7y2[12]),  12,13},
  {&(_tg__ZTV2C8__6G8x7y2[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y2[];
extern  VTBL_ENTRY _ZTV6G8x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y2[];
Class_Descriptor cd_G8x7y2 = {  "G8x7y2", // class name
  bases_G8x7y2, 6,
  &(vtc_G8x7y2[0]), // expected_vtbl_contents
  &(vtt_G8x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y2),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y3  : virtual E8x7 , virtual F1 {
  int ff;
  ~G8x7y3(); // tgen
  G8x7y3(); // tgen
};
//SIG(1 G8x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G8x7y3 ::~G8x7y3(){ note_dtor("G8x7y3", this);} // tgen
G8x7y3 ::G8x7y3(){ note_ctor("G8x7y3", this);} // tgen

static void Test_G8x7y3()
{
  extern Class_Descriptor cd_G8x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G8x7y3, buf);
    G8x7y3 *dp, &lv = *(dp=new (buf) G8x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G8x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y3)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,20), "G8x7y3");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,28), "G8x7y3");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(32,16), "G8x7y3");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(52,32), "G8x7y3");
    check_base_class_offset(lv, (E8x7*), ABISELECT(16,8), "G8x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G8x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x7y3.ff");
    test_class_info(&lv, &cd_G8x7y3);
    dp->~G8x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y3(Test_G8x7y3, "G8x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G8x7y3C1Ev();
extern void _ZN6G8x7y3D1Ev();
Name_Map name_map_G8x7y3[] = {
  NSPAIR(_ZN6G8x7y3C1Ev),
  NSPAIR(_ZN6G8x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G8x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G8x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x7y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G8x7y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G8x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G8x7y3[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y3[] = {
  {&(_ZTV6G8x7y3[7]),  7,19},
  {&(_ZTV6G8x7y3[12]),  12,19},
  {&(_ZTV6G8x7y3[15]),  15,19},
  {&(_ZTV6G8x7y3[18]),  18,19},
  {&(_tg__ZTV4E8x7__6G8x7y3[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y3[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x7y3[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y3[];
extern  VTBL_ENTRY _ZTV6G8x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y3[];
Class_Descriptor cd_G8x7y3 = {  "G8x7y3", // class name
  bases_G8x7y3, 6,
  &(vtc_G8x7y3[0]), // expected_vtbl_contents
  &(vtt_G8x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G8x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y3),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y4  : E8x7 , F0 {
  int ff;
  ~G8x7y4(); // tgen
  G8x7y4(); // tgen
};
//SIG(1 G8x7y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G8x7y4 ::~G8x7y4(){ note_dtor("G8x7y4", this);} // tgen
G8x7y4 ::G8x7y4(){ note_ctor("G8x7y4", this);} // tgen

static void Test_G8x7y4()
{
  extern Class_Descriptor cd_G8x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x7y4, buf);
    G8x7y4 *dp, &lv = *(dp=new (buf) G8x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y4)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(32,20), "G8x7y4");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(40,28), "G8x7y4");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(24,16), "G8x7y4");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(44,32), "G8x7y4");
    check_base_class_offset(lv, (E8x7*), 0, "G8x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G8x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G8x7y4.ff");
    test_class_info(&lv, &cd_G8x7y4);
    dp->~G8x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y4(Test_G8x7y4, "G8x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x7y4C1Ev();
extern void _ZN6G8x7y4D1Ev();
Name_Map name_map_G8x7y4[] = {
  NSPAIR(_ZN6G8x7y4C1Ev),
  NSPAIR(_ZN6G8x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y4[];
static  VTBL_ENTRY vtc_G8x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G8x7y4[0]),
};
extern VTBL_ENTRY _ZTV6G8x7y4[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y4[] = {
  {&(_ZTV6G8x7y4[5]),  5,8},
  {&(_tg__ZTV4E8x7__6G8x7y4[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y4[3]),  3,3},
  {&(_ZTV6G8x7y4[8]),  8,8},
  {&(_tg__ZTV2C8__6G8x7y4[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y4[];
extern  VTBL_ENTRY _ZTV6G8x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y4[];
Class_Descriptor cd_G8x7y4 = {  "G8x7y4", // class name
  bases_G8x7y4, 6,
  &(vtc_G8x7y4[0]), // expected_vtbl_contents
  &(vtt_G8x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y4),8, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y5  : virtual E8x7 , F0 {
  int ff;
  ~G8x7y5(); // tgen
  G8x7y5(); // tgen
};
//SIG(1 G8x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G8x7y5 ::~G8x7y5(){ note_dtor("G8x7y5", this);} // tgen
G8x7y5 ::G8x7y5(){ note_ctor("G8x7y5", this);} // tgen

static void Test_G8x7y5()
{
  extern Class_Descriptor cd_G8x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G8x7y5, buf);
    G8x7y5 *dp, &lv = *(dp=new (buf) G8x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G8x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y5)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,24), "G8x7y5");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,32), "G8x7y5");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(32,20), "G8x7y5");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(52,36), "G8x7y5");
    check_base_class_offset(lv, (E8x7*), ABISELECT(16,12), "G8x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G8x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x7y5.ff");
    test_class_info(&lv, &cd_G8x7y5);
    dp->~G8x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y5(Test_G8x7y5, "G8x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G8x7y5C1Ev();
extern void _ZN6G8x7y5D1Ev();
Name_Map name_map_G8x7y5[] = {
  NSPAIR(_ZN6G8x7y5C1Ev),
  NSPAIR(_ZN6G8x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y5[];
static  VTBL_ENTRY vtc_G8x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x7y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G8x7y5[0]),
};
extern VTBL_ENTRY _ZTV6G8x7y5[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y5[] = {
  {&(_ZTV6G8x7y5[6]),  6,14},
  {&(_ZTV6G8x7y5[11]),  11,14},
  {&(_ZTV6G8x7y5[14]),  14,14},
  {&(_tg__ZTV4E8x7__6G8x7y5[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y5[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x7y5[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y5[];
extern  VTBL_ENTRY _ZTV6G8x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y5[];
Class_Descriptor cd_G8x7y5 = {  "G8x7y5", // class name
  bases_G8x7y5, 6,
  &(vtc_G8x7y5[0]), // expected_vtbl_contents
  &(vtt_G8x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G8x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y5),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y6  : E8x7 , virtual F0 {
  int ff;
  ~G8x7y6(); // tgen
  G8x7y6(); // tgen
};
//SIG(1 G8x7y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x7y6 ::~G8x7y6(){ note_dtor("G8x7y6", this);} // tgen
G8x7y6 ::G8x7y6(){ note_ctor("G8x7y6", this);} // tgen

static void Test_G8x7y6()
{
  extern Class_Descriptor cd_G8x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G8x7y6, buf);
    G8x7y6 *dp, &lv = *(dp=new (buf) G8x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G8x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y6)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(24,16), "G8x7y6");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(32,24), "G8x7y6");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(16,12), "G8x7y6");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(36,28), "G8x7y6");
    check_base_class_offset(lv, (E8x7*), 0, "G8x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G8x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G8x7y6.ff");
    test_class_info(&lv, &cd_G8x7y6);
    dp->~G8x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y6(Test_G8x7y6, "G8x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G8x7y6C1Ev();
extern void _ZN6G8x7y6D1Ev();
Name_Map name_map_G8x7y6[] = {
  NSPAIR(_ZN6G8x7y6C1Ev),
  NSPAIR(_ZN6G8x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y6[];
static  VTBL_ENTRY vtc_G8x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y6[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G8x7y6[0]),
};
extern VTBL_ENTRY _ZTV6G8x7y6[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y6[] = {
  {&(_ZTV6G8x7y6[6]),  6,9},
  {&(_tg__ZTV4E8x7__6G8x7y6[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y6[3]),  3,3},
  {&(_ZTV6G8x7y6[9]),  9,9},
  {&(_tg__ZTV2C8__6G8x7y6[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y6[];
extern  VTBL_ENTRY _ZTV6G8x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y6[];
Class_Descriptor cd_G8x7y6 = {  "G8x7y6", // class name
  bases_G8x7y6, 6,
  &(vtc_G8x7y6[0]), // expected_vtbl_contents
  &(vtt_G8x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G8x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y6),9, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G8x7y7  : virtual E8x7 , virtual F0 {
  int ff;
  ~G8x7y7(); // tgen
  G8x7y7(); // tgen
};
//SIG(1 G8x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G8x7y7 ::~G8x7y7(){ note_dtor("G8x7y7", this);} // tgen
G8x7y7 ::G8x7y7(){ note_ctor("G8x7y7", this);} // tgen

static void Test_G8x7y7()
{
  extern Class_Descriptor cd_G8x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G8x7y7, buf);
    G8x7y7 *dp, &lv = *(dp=new (buf) G8x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G8x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G8x7y7)");
    check_base_class_offset(lv, (A0*)(C8*), ABISELECT(40,20), "G8x7y7");
    check_base_class_offset(lv, (B0*)(C8*), ABISELECT(48,28), "G8x7y7");
    check_base_class_offset(lv, (C8*)(E8x7*), ABISELECT(32,16), "G8x7y7");
    check_base_class_offset(lv, (D0*)(E8x7*), ABISELECT(52,32), "G8x7y7");
    check_base_class_offset(lv, (E8x7*), ABISELECT(16,8), "G8x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G8x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G8x7y7.ff");
    test_class_info(&lv, &cd_G8x7y7);
    dp->~G8x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG8x7y7(Test_G8x7y7, "G8x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G8x7y7C1Ev();
extern void _ZN6G8x7y7D1Ev();
Name_Map name_map_G8x7y7[] = {
  NSPAIR(_ZN6G8x7y7C1Ev),
  NSPAIR(_ZN6G8x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C8;
extern VTBL_ENTRY _ZTI2C8[];
extern  VTBL_ENTRY _ZTV2C8[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C8[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E8x7;
extern VTBL_ENTRY _ZTI4E8x7[];
extern  VTBL_ENTRY _ZTV4E8x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E8x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G8x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C8,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E8x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G8x7y7[];
static  VTBL_ENTRY vtc_G8x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G8x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G8x7y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G8x7y7[0]),
};
extern VTBL_ENTRY _ZTV6G8x7y7[];
static  VTBL_ENTRY _tg__ZTV4E8x7__6G8x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__4E8x7__6G8x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E8x7[0]),
};
static  VTBL_ENTRY _tg__ZTV2C8__6G8x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C8[0]),
};
static  VTT_ENTRY vtt_G8x7y7[] = {
  {&(_ZTV6G8x7y7[7]),  7,15},
  {&(_ZTV6G8x7y7[12]),  12,15},
  {&(_ZTV6G8x7y7[15]),  15,15},
  {&(_tg__ZTV4E8x7__6G8x7y7[5]),  5,5},
  {&(_tg__ZTV2C8__4E8x7__6G8x7y7[3]),  3,3},
  {&(_tg__ZTV2C8__6G8x7y7[3]),  3,3},
};
extern VTBL_ENTRY _ZTI6G8x7y7[];
extern  VTBL_ENTRY _ZTV6G8x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G8x7y7[];
Class_Descriptor cd_G8x7y7 = {  "G8x7y7", // class name
  bases_G8x7y7, 6,
  &(vtc_G8x7y7[0]), // expected_vtbl_contents
  &(vtt_G8x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G8x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G8x7y7),15, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G8x7y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E9x7  : virtual C9 , virtual D0 {
  int fd;
  ~E9x7(); // tgen
  E9x7(); // tgen
};
//SIG(-1 E9x7) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E9x7 ::~E9x7(){ note_dtor("E9x7", this);} // tgen
E9x7 ::E9x7(){ note_ctor("E9x7", this);} // tgen

static void Test_E9x7()
{
  extern Class_Descriptor cd_E9x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E9x7, buf);
    E9x7 *dp, &lv = *(dp=new (buf) E9x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E9x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E9x7)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,8), "E9x7");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,20), "E9x7");
    check_base_class_offset(lv, (C9*), ABISELECT(16,8), "E9x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E9x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E9x7.fd");
    test_class_info(&lv, &cd_E9x7);
    dp->~E9x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE9x7(Test_E9x7, "E9x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN4E9x7C1Ev();
extern void _ZN4E9x7D1Ev();
Name_Map name_map_E9x7[] = {
  NSPAIR(_ZN4E9x7C1Ev),
  NSPAIR(_ZN4E9x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E9x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI4E9x7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E9x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV4E9x7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E9x7[] = {
  {&(_ZTV4E9x7[5]),  5,10},
  {&(_ZTV4E9x7[9]),  9,10},
  {&(_tg__ZTV2C9__4E9x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
Class_Descriptor cd_E9x7 = {  "E9x7", // class name
  bases_E9x7, 4,
  &(vtc_E9x7[0]), // expected_vtbl_contents
  &(vtt_E9x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI4E9x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV4E9x7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT4E9x7),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y0  : E9x7 , F1 {
  int ff;
  ~G9x7y0(); // tgen
  G9x7y0(); // tgen
};
//SIG(1 G9x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x7y0 ::~G9x7y0(){ note_dtor("G9x7y0", this);} // tgen
G9x7y0 ::G9x7y0(){ note_ctor("G9x7y0", this);} // tgen

static void Test_G9x7y0()
{
  extern Class_Descriptor cd_G9x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x7y0, buf);
    G9x7y0 *dp, &lv = *(dp=new (buf) G9x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y0)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x7y0");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x7y0");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(32,20), "G9x7y0");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(52,36), "G9x7y0");
    check_base_class_offset(lv, (E9x7*), 0, "G9x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G9x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G9x7y0.ff");
    test_class_info(&lv, &cd_G9x7y0);
    dp->~G9x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y0(Test_G9x7y0, "G9x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x7y0C1Ev();
extern void _ZN6G9x7y0D1Ev();
Name_Map name_map_G9x7y0[] = {
  NSPAIR(_ZN6G9x7y0C1Ev),
  NSPAIR(_ZN6G9x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G9x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y0[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y0[] = {
  {&(_ZTV6G9x7y0[5]),  5,13},
  {&(_tg__ZTV4E9x7__6G9x7y0[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y0[4]),  4,5},
  {&(_ZTV6G9x7y0[12]),  12,13},
  {&(_tg__ZTV2C9__6G9x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y0[];
extern  VTBL_ENTRY _ZTV6G9x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y0[];
Class_Descriptor cd_G9x7y0 = {  "G9x7y0", // class name
  bases_G9x7y0, 6,
  &(vtc_G9x7y0[0]), // expected_vtbl_contents
  &(vtt_G9x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y1  : virtual E9x7 , F1 {
  int ff;
  ~G9x7y1(); // tgen
  G9x7y1(); // tgen
};
//SIG(1 G9x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G9x7y1 ::~G9x7y1(){ note_dtor("G9x7y1", this);} // tgen
G9x7y1 ::G9x7y1(){ note_ctor("G9x7y1", this);} // tgen

static void Test_G9x7y1()
{
  extern Class_Descriptor cd_G9x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x7y1, buf);
    G9x7y1 *dp, &lv = *(dp=new (buf) G9x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y1)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x7y1");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x7y1");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(32,20), "G9x7y1");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(52,36), "G9x7y1");
    check_base_class_offset(lv, (E9x7*), ABISELECT(16,12), "G9x7y1");
    check_base_class_offset(lv, (F1*), 0, "G9x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x7y1.ff");
    test_class_info(&lv, &cd_G9x7y1);
    dp->~G9x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y1(Test_G9x7y1, "G9x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x7y1C1Ev();
extern void _ZN6G9x7y1D1Ev();
Name_Map name_map_G9x7y1[] = {
  NSPAIR(_ZN6G9x7y1C1Ev),
  NSPAIR(_ZN6G9x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G9x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y1[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y1[] = {
  {&(_ZTV6G9x7y1[6]),  6,17},
  {&(_ZTV6G9x7y1[12]),  12,17},
  {&(_ZTV6G9x7y1[16]),  16,17},
  {&(_tg__ZTV4E9x7__6G9x7y1[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y1[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y1[];
extern  VTBL_ENTRY _ZTV6G9x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y1[];
Class_Descriptor cd_G9x7y1 = {  "G9x7y1", // class name
  bases_G9x7y1, 6,
  &(vtc_G9x7y1[0]), // expected_vtbl_contents
  &(vtt_G9x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y2  : E9x7 , virtual F1 {
  int ff;
  ~G9x7y2(); // tgen
  G9x7y2(); // tgen
};
//SIG(1 G9x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x7y2 ::~G9x7y2(){ note_dtor("G9x7y2", this);} // tgen
G9x7y2 ::G9x7y2(){ note_ctor("G9x7y2", this);} // tgen

static void Test_G9x7y2()
{
  extern Class_Descriptor cd_G9x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x7y2, buf);
    G9x7y2 *dp, &lv = *(dp=new (buf) G9x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y2)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,12), "G9x7y2");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,24), "G9x7y2");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(16,12), "G9x7y2");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(36,28), "G9x7y2");
    check_base_class_offset(lv, (E9x7*), 0, "G9x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G9x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x7y2.ff");
    test_class_info(&lv, &cd_G9x7y2);
    dp->~G9x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y2(Test_G9x7y2, "G9x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x7y2C1Ev();
extern void _ZN6G9x7y2D1Ev();
Name_Map name_map_G9x7y2[] = {
  NSPAIR(_ZN6G9x7y2C1Ev),
  NSPAIR(_ZN6G9x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI6G9x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y2[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y2[] = {
  {&(_ZTV6G9x7y2[6]),  6,15},
  {&(_tg__ZTV4E9x7__6G9x7y2[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y2[4]),  4,5},
  {&(_ZTV6G9x7y2[10]),  10,15},
  {&(_ZTV6G9x7y2[14]),  14,15},
  {&(_tg__ZTV2C9__6G9x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y2[];
extern  VTBL_ENTRY _ZTV6G9x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y2[];
Class_Descriptor cd_G9x7y2 = {  "G9x7y2", // class name
  bases_G9x7y2, 6,
  &(vtc_G9x7y2[0]), // expected_vtbl_contents
  &(vtt_G9x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y3  : virtual E9x7 , virtual F1 {
  int ff;
  ~G9x7y3(); // tgen
  G9x7y3(); // tgen
};
//SIG(1 G9x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G9x7y3 ::~G9x7y3(){ note_dtor("G9x7y3", this);} // tgen
G9x7y3 ::G9x7y3(){ note_ctor("G9x7y3", this);} // tgen

static void Test_G9x7y3()
{
  extern Class_Descriptor cd_G9x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G9x7y3, buf);
    G9x7y3 *dp, &lv = *(dp=new (buf) G9x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G9x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y3)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,16), "G9x7y3");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,28), "G9x7y3");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(32,16), "G9x7y3");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(52,32), "G9x7y3");
    check_base_class_offset(lv, (E9x7*), ABISELECT(16,8), "G9x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G9x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x7y3.ff");
    test_class_info(&lv, &cd_G9x7y3);
    dp->~G9x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y3(Test_G9x7y3, "G9x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN6G9x7y3C1Ev();
extern void _ZN6G9x7y3D1Ev();
Name_Map name_map_G9x7y3[] = {
  NSPAIR(_ZN6G9x7y3C1Ev),
  NSPAIR(_ZN6G9x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G9x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G9x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G9x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI6G9x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y3[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y3[] = {
  {&(_ZTV6G9x7y3[7]),  7,21},
  {&(_ZTV6G9x7y3[12]),  12,21},
  {&(_ZTV6G9x7y3[16]),  16,21},
  {&(_ZTV6G9x7y3[20]),  20,21},
  {&(_tg__ZTV4E9x7__6G9x7y3[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y3[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y3[];
extern  VTBL_ENTRY _ZTV6G9x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y3[];
Class_Descriptor cd_G9x7y3 = {  "G9x7y3", // class name
  bases_G9x7y3, 6,
  &(vtc_G9x7y3[0]), // expected_vtbl_contents
  &(vtt_G9x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI6G9x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y4  : E9x7 , F0 {
  int ff;
  ~G9x7y4(); // tgen
  G9x7y4(); // tgen
};
//SIG(1 G9x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G9x7y4 ::~G9x7y4(){ note_dtor("G9x7y4", this);} // tgen
G9x7y4 ::G9x7y4(){ note_ctor("G9x7y4", this);} // tgen

static void Test_G9x7y4()
{
  extern Class_Descriptor cd_G9x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x7y4, buf);
    G9x7y4 *dp, &lv = *(dp=new (buf) G9x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y4)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(24,16), "G9x7y4");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(40,28), "G9x7y4");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(24,16), "G9x7y4");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(44,32), "G9x7y4");
    check_base_class_offset(lv, (E9x7*), 0, "G9x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G9x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G9x7y4.ff");
    test_class_info(&lv, &cd_G9x7y4);
    dp->~G9x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y4(Test_G9x7y4, "G9x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x7y4C1Ev();
extern void _ZN6G9x7y4D1Ev();
Name_Map name_map_G9x7y4[] = {
  NSPAIR(_ZN6G9x7y4C1Ev),
  NSPAIR(_ZN6G9x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI6G9x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y4[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y4[] = {
  {&(_ZTV6G9x7y4[5]),  5,10},
  {&(_tg__ZTV4E9x7__6G9x7y4[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y4[4]),  4,5},
  {&(_ZTV6G9x7y4[9]),  9,10},
  {&(_tg__ZTV2C9__6G9x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y4[];
extern  VTBL_ENTRY _ZTV6G9x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y4[];
Class_Descriptor cd_G9x7y4 = {  "G9x7y4", // class name
  bases_G9x7y4, 6,
  &(vtc_G9x7y4[0]), // expected_vtbl_contents
  &(vtt_G9x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y5  : virtual E9x7 , F0 {
  int ff;
  ~G9x7y5(); // tgen
  G9x7y5(); // tgen
};
//SIG(1 G9x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G9x7y5 ::~G9x7y5(){ note_dtor("G9x7y5", this);} // tgen
G9x7y5 ::G9x7y5(){ note_ctor("G9x7y5", this);} // tgen

static void Test_G9x7y5()
{
  extern Class_Descriptor cd_G9x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G9x7y5, buf);
    G9x7y5 *dp, &lv = *(dp=new (buf) G9x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G9x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y5)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,20), "G9x7y5");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,32), "G9x7y5");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(32,20), "G9x7y5");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(52,36), "G9x7y5");
    check_base_class_offset(lv, (E9x7*), ABISELECT(16,12), "G9x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G9x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x7y5.ff");
    test_class_info(&lv, &cd_G9x7y5);
    dp->~G9x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y5(Test_G9x7y5, "G9x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN6G9x7y5C1Ev();
extern void _ZN6G9x7y5D1Ev();
Name_Map name_map_G9x7y5[] = {
  NSPAIR(_ZN6G9x7y5C1Ev),
  NSPAIR(_ZN6G9x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI6G9x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y5[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y5[] = {
  {&(_ZTV6G9x7y5[6]),  6,16},
  {&(_ZTV6G9x7y5[11]),  11,16},
  {&(_ZTV6G9x7y5[15]),  15,16},
  {&(_tg__ZTV4E9x7__6G9x7y5[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y5[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y5[];
extern  VTBL_ENTRY _ZTV6G9x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y5[];
Class_Descriptor cd_G9x7y5 = {  "G9x7y5", // class name
  bases_G9x7y5, 6,
  &(vtc_G9x7y5[0]), // expected_vtbl_contents
  &(vtt_G9x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI6G9x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y6  : E9x7 , virtual F0 {
  int ff;
  ~G9x7y6(); // tgen
  G9x7y6(); // tgen
};
//SIG(1 G9x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x7y6 ::~G9x7y6(){ note_dtor("G9x7y6", this);} // tgen
G9x7y6 ::G9x7y6(){ note_ctor("G9x7y6", this);} // tgen

static void Test_G9x7y6()
{
  extern Class_Descriptor cd_G9x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G9x7y6, buf);
    G9x7y6 *dp, &lv = *(dp=new (buf) G9x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G9x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y6)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(16,12), "G9x7y6");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(32,24), "G9x7y6");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(16,12), "G9x7y6");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(36,28), "G9x7y6");
    check_base_class_offset(lv, (E9x7*), 0, "G9x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G9x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G9x7y6.ff");
    test_class_info(&lv, &cd_G9x7y6);
    dp->~G9x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y6(Test_G9x7y6, "G9x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN6G9x7y6C1Ev();
extern void _ZN6G9x7y6D1Ev();
Name_Map name_map_G9x7y6[] = {
  NSPAIR(_ZN6G9x7y6C1Ev),
  NSPAIR(_ZN6G9x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI6G9x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y6[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y6[] = {
  {&(_ZTV6G9x7y6[6]),  6,11},
  {&(_tg__ZTV4E9x7__6G9x7y6[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y6[4]),  4,5},
  {&(_ZTV6G9x7y6[10]),  10,11},
  {&(_tg__ZTV2C9__6G9x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y6[];
extern  VTBL_ENTRY _ZTV6G9x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y6[];
Class_Descriptor cd_G9x7y6 = {  "G9x7y6", // class name
  bases_G9x7y6, 6,
  &(vtc_G9x7y6[0]), // expected_vtbl_contents
  &(vtt_G9x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI6G9x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G9x7y7  : virtual E9x7 , virtual F0 {
  int ff;
  ~G9x7y7(); // tgen
  G9x7y7(); // tgen
};
//SIG(1 G9x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G9x7y7 ::~G9x7y7(){ note_dtor("G9x7y7", this);} // tgen
G9x7y7 ::G9x7y7(){ note_ctor("G9x7y7", this);} // tgen

static void Test_G9x7y7()
{
  extern Class_Descriptor cd_G9x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G9x7y7, buf);
    G9x7y7 *dp, &lv = *(dp=new (buf) G9x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G9x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G9x7y7)");
    check_base_class_offset(lv, (A1*)(C9*), ABISELECT(32,16), "G9x7y7");
    check_base_class_offset(lv, (B0*)(C9*), ABISELECT(48,28), "G9x7y7");
    check_base_class_offset(lv, (C9*)(E9x7*), ABISELECT(32,16), "G9x7y7");
    check_base_class_offset(lv, (D0*)(E9x7*), ABISELECT(52,32), "G9x7y7");
    check_base_class_offset(lv, (E9x7*), ABISELECT(16,8), "G9x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G9x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G9x7y7.ff");
    test_class_info(&lv, &cd_G9x7y7);
    dp->~G9x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG9x7y7(Test_G9x7y7, "G9x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN6G9x7y7C1Ev();
extern void _ZN6G9x7y7D1Ev();
Name_Map name_map_G9x7y7[] = {
  NSPAIR(_ZN6G9x7y7C1Ev),
  NSPAIR(_ZN6G9x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C9;
extern VTBL_ENTRY _ZTI2C9[];
extern  VTBL_ENTRY _ZTV2C9[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT2C9[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E9x7;
extern VTBL_ENTRY _ZTI4E9x7[];
extern  VTBL_ENTRY _ZTV4E9x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT4E9x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G9x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C9,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E9x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI6G9x7y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G9x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI6G9x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI6G9x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI6G9x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV6G9x7y7[];
static  VTBL_ENTRY _tg__ZTV4E9x7__6G9x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__4E9x7__6G9x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI4E9x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2C9__6G9x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI2C9[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G9x7y7[] = {
  {&(_ZTV6G9x7y7[7]),  7,17},
  {&(_ZTV6G9x7y7[12]),  12,17},
  {&(_ZTV6G9x7y7[16]),  16,17},
  {&(_tg__ZTV4E9x7__6G9x7y7[5]),  5,5},
  {&(_tg__ZTV2C9__4E9x7__6G9x7y7[4]),  4,5},
  {&(_tg__ZTV2C9__6G9x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI6G9x7y7[];
extern  VTBL_ENTRY _ZTV6G9x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT6G9x7y7[];
Class_Descriptor cd_G9x7y7 = {  "G9x7y7", // class name
  bases_G9x7y7, 6,
  &(vtc_G9x7y7[0]), // expected_vtbl_contents
  &(vtt_G9x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI6G9x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV6G9x7y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT6G9x7y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E10x7  : virtual C10 , virtual D0 {
  int fd;
  ~E10x7(); // tgen
  E10x7(); // tgen
};
//SIG(-1 E10x7) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E10x7 ::~E10x7(){ note_dtor("E10x7", this);} // tgen
E10x7 ::E10x7(){ note_ctor("E10x7", this);} // tgen

static void Test_E10x7()
{
  extern Class_Descriptor cd_E10x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E10x7, buf);
    E10x7 *dp, &lv = *(dp=new (buf) E10x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E10x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E10x7)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,16), "E10x7");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,20), "E10x7");
    check_base_class_offset(lv, (C10*), ABISELECT(16,8), "E10x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E10x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E10x7.fd");
    test_class_info(&lv, &cd_E10x7);
    dp->~E10x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE10x7(Test_E10x7, "E10x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E10x7C1Ev();
extern void _ZN5E10x7D1Ev();
Name_Map name_map_E10x7[] = {
  NSPAIR(_ZN5E10x7C1Ev),
  NSPAIR(_ZN5E10x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E10x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E10x7[];
static  VTBL_ENTRY vtc_E10x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
extern VTBL_ENTRY _ZTV5E10x7[];
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_E10x7[] = {
  {&(_ZTV5E10x7[6]),  6,10},
  {&(_ZTV5E10x7[10]),  10,10},
  {&(_tg__ZTV3C10__5E10x7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
Class_Descriptor cd_E10x7 = {  "E10x7", // class name
  bases_E10x7, 4,
  &(vtc_E10x7[0]), // expected_vtbl_contents
  &(vtt_E10x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E10x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E10x7),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E10x7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y0  : E10x7 , F1 {
  int ff;
  ~G10x7y0(); // tgen
  G10x7y0(); // tgen
};
//SIG(1 G10x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x7y0 ::~G10x7y0(){ note_dtor("G10x7y0", this);} // tgen
G10x7y0 ::G10x7y0(){ note_ctor("G10x7y0", this);} // tgen

static void Test_G10x7y0()
{
  extern Class_Descriptor cd_G10x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x7y0, buf);
    G10x7y0 *dp, &lv = *(dp=new (buf) G10x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y0)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x7y0");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x7y0");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(32,20), "G10x7y0");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(52,36), "G10x7y0");
    check_base_class_offset(lv, (E10x7*), 0, "G10x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G10x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G10x7y0.ff");
    test_class_info(&lv, &cd_G10x7y0);
    dp->~G10x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y0(Test_G10x7y0, "G10x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x7y0C1Ev();
extern void _ZN7G10x7y0D1Ev();
Name_Map name_map_G10x7y0[] = {
  NSPAIR(_ZN7G10x7y0C1Ev),
  NSPAIR(_ZN7G10x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y0[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G10x7y0[0]),
};
extern VTBL_ENTRY _ZTV7G10x7y0[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y0[] = {
  {&(_ZTV7G10x7y0[6]),  6,13},
  {&(_tg__ZTV5E10x7__7G10x7y0[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y0[4]),  4,4},
  {&(_ZTV7G10x7y0[13]),  13,13},
  {&(_tg__ZTV3C10__7G10x7y0[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y0[];
extern  VTBL_ENTRY _ZTV7G10x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y0[];
Class_Descriptor cd_G10x7y0 = {  "G10x7y0", // class name
  bases_G10x7y0, 6,
  &(vtc_G10x7y0[0]), // expected_vtbl_contents
  &(vtt_G10x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y0),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y1  : virtual E10x7 , F1 {
  int ff;
  ~G10x7y1(); // tgen
  G10x7y1(); // tgen
};
//SIG(1 G10x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v1 Fi} Fi}


G10x7y1 ::~G10x7y1(){ note_dtor("G10x7y1", this);} // tgen
G10x7y1 ::G10x7y1(){ note_ctor("G10x7y1", this);} // tgen

static void Test_G10x7y1()
{
  extern Class_Descriptor cd_G10x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x7y1, buf);
    G10x7y1 *dp, &lv = *(dp=new (buf) G10x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y1)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x7y1");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x7y1");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(32,20), "G10x7y1");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(52,36), "G10x7y1");
    check_base_class_offset(lv, (E10x7*), ABISELECT(16,12), "G10x7y1");
    check_base_class_offset(lv, (F1*), 0, "G10x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x7y1.ff");
    test_class_info(&lv, &cd_G10x7y1);
    dp->~G10x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y1(Test_G10x7y1, "G10x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x7y1C1Ev();
extern void _ZN7G10x7y1D1Ev();
Name_Map name_map_G10x7y1[] = {
  NSPAIR(_ZN7G10x7y1C1Ev),
  NSPAIR(_ZN7G10x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y1[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x7y1[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G10x7y1[0]),
};
extern VTBL_ENTRY _ZTV7G10x7y1[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y1[] = {
  {&(_ZTV7G10x7y1[7]),  7,18},
  {&(_ZTV7G10x7y1[14]),  14,18},
  {&(_ZTV7G10x7y1[18]),  18,18},
  {&(_tg__ZTV5E10x7__7G10x7y1[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y1[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x7y1[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y1[];
extern  VTBL_ENTRY _ZTV7G10x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y1[];
Class_Descriptor cd_G10x7y1 = {  "G10x7y1", // class name
  bases_G10x7y1, 6,
  &(vtc_G10x7y1[0]), // expected_vtbl_contents
  &(vtt_G10x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y1),18, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y2  : E10x7 , virtual F1 {
  int ff;
  ~G10x7y2(); // tgen
  G10x7y2(); // tgen
};
//SIG(1 G10x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x7y2 ::~G10x7y2(){ note_dtor("G10x7y2", this);} // tgen
G10x7y2 ::G10x7y2(){ note_ctor("G10x7y2", this);} // tgen

static void Test_G10x7y2()
{
  extern Class_Descriptor cd_G10x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x7y2, buf);
    G10x7y2 *dp, &lv = *(dp=new (buf) G10x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y2)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,20), "G10x7y2");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,24), "G10x7y2");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(16,12), "G10x7y2");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(36,28), "G10x7y2");
    check_base_class_offset(lv, (E10x7*), 0, "G10x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G10x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x7y2.ff");
    test_class_info(&lv, &cd_G10x7y2);
    dp->~G10x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y2(Test_G10x7y2, "G10x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x7y2C1Ev();
extern void _ZN7G10x7y2D1Ev();
Name_Map name_map_G10x7y2[] = {
  NSPAIR(_ZN7G10x7y2C1Ev),
  NSPAIR(_ZN7G10x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y2[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y2[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x7y2[0]),
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G10x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x7y2[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y2[] = {
  {&(_ZTV7G10x7y2[7]),  7,15},
  {&(_tg__ZTV5E10x7__7G10x7y2[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y2[4]),  4,4},
  {&(_ZTV7G10x7y2[11]),  11,15},
  {&(_ZTV7G10x7y2[14]),  14,15},
  {&(_tg__ZTV3C10__7G10x7y2[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y2[];
extern  VTBL_ENTRY _ZTV7G10x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y2[];
Class_Descriptor cd_G10x7y2 = {  "G10x7y2", // class name
  bases_G10x7y2, 6,
  &(vtc_G10x7y2[0]), // expected_vtbl_contents
  &(vtt_G10x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y2),15, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y3  : virtual E10x7 , virtual F1 {
  int ff;
  ~G10x7y3(); // tgen
  G10x7y3(); // tgen
};
//SIG(1 G10x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v1 Fi} Fi}


G10x7y3 ::~G10x7y3(){ note_dtor("G10x7y3", this);} // tgen
G10x7y3 ::G10x7y3(){ note_ctor("G10x7y3", this);} // tgen

static void Test_G10x7y3()
{
  extern Class_Descriptor cd_G10x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G10x7y3, buf);
    G10x7y3 *dp, &lv = *(dp=new (buf) G10x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G10x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y3)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,24), "G10x7y3");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,28), "G10x7y3");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(32,16), "G10x7y3");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(52,32), "G10x7y3");
    check_base_class_offset(lv, (E10x7*), ABISELECT(16,8), "G10x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G10x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x7y3.ff");
    test_class_info(&lv, &cd_G10x7y3);
    dp->~G10x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y3(Test_G10x7y3, "G10x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G10x7y3C1Ev();
extern void _ZN7G10x7y3D1Ev();
Name_Map name_map_G10x7y3[] = {
  NSPAIR(_ZN7G10x7y3C1Ev),
  NSPAIR(_ZN7G10x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G10x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y3[];
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G10x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x7y3[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G10x7y3[0]),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G10x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G10x7y3[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y3[] = {
  {&(_ZTV7G10x7y3[8]),  8,22},
  {&(_ZTV7G10x7y3[14]),  14,22},
  {&(_ZTV7G10x7y3[18]),  18,22},
  {&(_ZTV7G10x7y3[21]),  21,22},
  {&(_tg__ZTV5E10x7__7G10x7y3[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y3[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x7y3[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y3[];
extern  VTBL_ENTRY _ZTV7G10x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y3[];
Class_Descriptor cd_G10x7y3 = {  "G10x7y3", // class name
  bases_G10x7y3, 6,
  &(vtc_G10x7y3[0]), // expected_vtbl_contents
  &(vtt_G10x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G10x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y3),22, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y4  : E10x7 , F0 {
  int ff;
  ~G10x7y4(); // tgen
  G10x7y4(); // tgen
};
//SIG(1 G10x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G10x7y4 ::~G10x7y4(){ note_dtor("G10x7y4", this);} // tgen
G10x7y4 ::G10x7y4(){ note_ctor("G10x7y4", this);} // tgen

static void Test_G10x7y4()
{
  extern Class_Descriptor cd_G10x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x7y4, buf);
    G10x7y4 *dp, &lv = *(dp=new (buf) G10x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y4)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(36,24), "G10x7y4");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(40,28), "G10x7y4");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(24,16), "G10x7y4");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(44,32), "G10x7y4");
    check_base_class_offset(lv, (E10x7*), 0, "G10x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G10x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G10x7y4.ff");
    test_class_info(&lv, &cd_G10x7y4);
    dp->~G10x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y4(Test_G10x7y4, "G10x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x7y4C1Ev();
extern void _ZN7G10x7y4D1Ev();
Name_Map name_map_G10x7y4[] = {
  NSPAIR(_ZN7G10x7y4C1Ev),
  NSPAIR(_ZN7G10x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y4[];
static  VTBL_ENTRY vtc_G10x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y4[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G10x7y4[0]),
};
extern VTBL_ENTRY _ZTV7G10x7y4[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y4[] = {
  {&(_ZTV7G10x7y4[6]),  6,10},
  {&(_tg__ZTV5E10x7__7G10x7y4[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y4[4]),  4,4},
  {&(_ZTV7G10x7y4[10]),  10,10},
  {&(_tg__ZTV3C10__7G10x7y4[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y4[];
extern  VTBL_ENTRY _ZTV7G10x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y4[];
Class_Descriptor cd_G10x7y4 = {  "G10x7y4", // class name
  bases_G10x7y4, 6,
  &(vtc_G10x7y4[0]), // expected_vtbl_contents
  &(vtt_G10x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y4),10, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y5  : virtual E10x7 , F0 {
  int ff;
  ~G10x7y5(); // tgen
  G10x7y5(); // tgen
};
//SIG(1 G10x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G10x7y5 ::~G10x7y5(){ note_dtor("G10x7y5", this);} // tgen
G10x7y5 ::G10x7y5(){ note_ctor("G10x7y5", this);} // tgen

static void Test_G10x7y5()
{
  extern Class_Descriptor cd_G10x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G10x7y5, buf);
    G10x7y5 *dp, &lv = *(dp=new (buf) G10x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G10x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y5)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,28), "G10x7y5");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,32), "G10x7y5");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(32,20), "G10x7y5");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(52,36), "G10x7y5");
    check_base_class_offset(lv, (E10x7*), ABISELECT(16,12), "G10x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G10x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x7y5.ff");
    test_class_info(&lv, &cd_G10x7y5);
    dp->~G10x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y5(Test_G10x7y5, "G10x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G10x7y5C1Ev();
extern void _ZN7G10x7y5D1Ev();
Name_Map name_map_G10x7y5[] = {
  NSPAIR(_ZN7G10x7y5C1Ev),
  NSPAIR(_ZN7G10x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y5[];
static  VTBL_ENTRY vtc_G10x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x7y5[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G10x7y5[0]),
};
extern VTBL_ENTRY _ZTV7G10x7y5[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y5[] = {
  {&(_ZTV7G10x7y5[7]),  7,17},
  {&(_ZTV7G10x7y5[13]),  13,17},
  {&(_ZTV7G10x7y5[17]),  17,17},
  {&(_tg__ZTV5E10x7__7G10x7y5[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y5[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x7y5[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y5[];
extern  VTBL_ENTRY _ZTV7G10x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y5[];
Class_Descriptor cd_G10x7y5 = {  "G10x7y5", // class name
  bases_G10x7y5, 6,
  &(vtc_G10x7y5[0]), // expected_vtbl_contents
  &(vtt_G10x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G10x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y5),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y6  : E10x7 , virtual F0 {
  int ff;
  ~G10x7y6(); // tgen
  G10x7y6(); // tgen
};
//SIG(1 G10x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x7y6 ::~G10x7y6(){ note_dtor("G10x7y6", this);} // tgen
G10x7y6 ::G10x7y6(){ note_ctor("G10x7y6", this);} // tgen

static void Test_G10x7y6()
{
  extern Class_Descriptor cd_G10x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G10x7y6, buf);
    G10x7y6 *dp, &lv = *(dp=new (buf) G10x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G10x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y6)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(28,20), "G10x7y6");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(32,24), "G10x7y6");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(16,12), "G10x7y6");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(36,28), "G10x7y6");
    check_base_class_offset(lv, (E10x7*), 0, "G10x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G10x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G10x7y6.ff");
    test_class_info(&lv, &cd_G10x7y6);
    dp->~G10x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y6(Test_G10x7y6, "G10x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G10x7y6C1Ev();
extern void _ZN7G10x7y6D1Ev();
Name_Map name_map_G10x7y6[] = {
  NSPAIR(_ZN7G10x7y6C1Ev),
  NSPAIR(_ZN7G10x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y6[];
static  VTBL_ENTRY vtc_G10x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y6[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G10x7y6[0]),
};
extern VTBL_ENTRY _ZTV7G10x7y6[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y6[] = {
  {&(_ZTV7G10x7y6[7]),  7,11},
  {&(_tg__ZTV5E10x7__7G10x7y6[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y6[4]),  4,4},
  {&(_ZTV7G10x7y6[11]),  11,11},
  {&(_tg__ZTV3C10__7G10x7y6[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y6[];
extern  VTBL_ENTRY _ZTV7G10x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y6[];
Class_Descriptor cd_G10x7y6 = {  "G10x7y6", // class name
  bases_G10x7y6, 6,
  &(vtc_G10x7y6[0]), // expected_vtbl_contents
  &(vtt_G10x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G10x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y6),11, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G10x7y7  : virtual E10x7 , virtual F0 {
  int ff;
  ~G10x7y7(); // tgen
  G10x7y7(); // tgen
};
//SIG(1 G10x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G10x7y7 ::~G10x7y7(){ note_dtor("G10x7y7", this);} // tgen
G10x7y7 ::G10x7y7(){ note_ctor("G10x7y7", this);} // tgen

static void Test_G10x7y7()
{
  extern Class_Descriptor cd_G10x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G10x7y7, buf);
    G10x7y7 *dp, &lv = *(dp=new (buf) G10x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G10x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G10x7y7)");
    check_base_class_offset(lv, (A0*)(C10*), ABISELECT(44,24), "G10x7y7");
    check_base_class_offset(lv, (B0*)(C10*), ABISELECT(48,28), "G10x7y7");
    check_base_class_offset(lv, (C10*)(E10x7*), ABISELECT(32,16), "G10x7y7");
    check_base_class_offset(lv, (D0*)(E10x7*), ABISELECT(52,32), "G10x7y7");
    check_base_class_offset(lv, (E10x7*), ABISELECT(16,8), "G10x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G10x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G10x7y7.ff");
    test_class_info(&lv, &cd_G10x7y7);
    dp->~G10x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG10x7y7(Test_G10x7y7, "G10x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G10x7y7C1Ev();
extern void _ZN7G10x7y7D1Ev();
Name_Map name_map_G10x7y7[] = {
  NSPAIR(_ZN7G10x7y7C1Ev),
  NSPAIR(_ZN7G10x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C10;
extern VTBL_ENTRY _ZTI3C10[];
extern  VTBL_ENTRY _ZTV3C10[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C10[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E10x7;
extern VTBL_ENTRY _ZTI5E10x7[];
extern  VTBL_ENTRY _ZTV5E10x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E10x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G10x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C10,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E10x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G10x7y7[];
static  VTBL_ENTRY vtc_G10x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G10x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G10x7y7[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G10x7y7[0]),
};
extern VTBL_ENTRY _ZTV7G10x7y7[];
static  VTBL_ENTRY _tg__ZTV5E10x7__7G10x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__5E10x7__7G10x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E10x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C10__7G10x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C10[0]),
};
static  VTT_ENTRY vtt_G10x7y7[] = {
  {&(_ZTV7G10x7y7[8]),  8,18},
  {&(_ZTV7G10x7y7[14]),  14,18},
  {&(_ZTV7G10x7y7[18]),  18,18},
  {&(_tg__ZTV5E10x7__7G10x7y7[6]),  6,6},
  {&(_tg__ZTV3C10__5E10x7__7G10x7y7[4]),  4,4},
  {&(_tg__ZTV3C10__7G10x7y7[4]),  4,4},
};
extern VTBL_ENTRY _ZTI7G10x7y7[];
extern  VTBL_ENTRY _ZTV7G10x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G10x7y7[];
Class_Descriptor cd_G10x7y7 = {  "G10x7y7", // class name
  bases_G10x7y7, 6,
  &(vtc_G10x7y7[0]), // expected_vtbl_contents
  &(vtt_G10x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G10x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G10x7y7),18, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G10x7y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E11x7  : virtual C11 , virtual D0 {
  int fd;
  ~E11x7(); // tgen
  E11x7(); // tgen
};
//SIG(-1 E11x7) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} Fi} VBC5{ Fi} Fi}


E11x7 ::~E11x7(){ note_dtor("E11x7", this);} // tgen
E11x7 ::E11x7(){ note_ctor("E11x7", this);} // tgen

static void Test_E11x7()
{
  extern Class_Descriptor cd_E11x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E11x7, buf);
    E11x7 *dp, &lv = *(dp=new (buf) E11x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E11x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E11x7)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,16), "E11x7");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,24), "E11x7");
    check_base_class_offset(lv, (C11*), ABISELECT(16,8), "E11x7");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E11x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E11x7.fd");
    test_class_info(&lv, &cd_E11x7);
    dp->~E11x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE11x7(Test_E11x7, "E11x7", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN5E11x7C1Ev();
extern void _ZN5E11x7D1Ev();
Name_Map name_map_E11x7[] = {
  NSPAIR(_ZN5E11x7C1Ev),
  NSPAIR(_ZN5E11x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E11x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E11x7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_E11x7[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV5E11x7[];
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__5E11x7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_E11x7[] = {
  {&(_ZTV5E11x7[6]),  6,14},
  {&(_ZTV5E11x7[10]),  10,14},
  {&(_ZTV5E11x7[13]),  13,14},
  {&(_tg__ZTV3C11__5E11x7[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__5E11x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
Class_Descriptor cd_E11x7 = {  "E11x7", // class name
  bases_E11x7, 4,
  &(vtc_E11x7[0]), // expected_vtbl_contents
  &(vtt_E11x7[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI5E11x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E11x7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E11x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y0  : E11x7 , F1 {
  int ff;
  ~G11x7y0(); // tgen
  G11x7y0(); // tgen
};
//SIG(1 G11x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x7y0 ::~G11x7y0(){ note_dtor("G11x7y0", this);} // tgen
G11x7y0 ::G11x7y0(){ note_ctor("G11x7y0", this);} // tgen

static void Test_G11x7y0()
{
  extern Class_Descriptor cd_G11x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x7y0, buf);
    G11x7y0 *dp, &lv = *(dp=new (buf) G11x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y0)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x7y0");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x7y0");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(32,20), "G11x7y0");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(64,40), "G11x7y0");
    check_base_class_offset(lv, (E11x7*), 0, "G11x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G11x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G11x7y0.ff");
    test_class_info(&lv, &cd_G11x7y0);
    dp->~G11x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y0(Test_G11x7y0, "G11x7y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x7y0C1Ev();
extern void _ZN7G11x7y0D1Ev();
Name_Map name_map_G11x7y0[] = {
  NSPAIR(_ZN7G11x7y0C1Ev),
  NSPAIR(_ZN7G11x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x7y0[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G11x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y0[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y0[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y0[] = {
  {&(_ZTV7G11x7y0[6]),  6,17},
  {&(_tg__ZTV5E11x7__7G11x7y0[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y0[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y0[3]),  3,4},
  {&(_ZTV7G11x7y0[13]),  13,17},
  {&(_ZTV7G11x7y0[16]),  16,17},
  {&(_tg__ZTV3C11__7G11x7y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y0[];
extern  VTBL_ENTRY _ZTV7G11x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y0[];
Class_Descriptor cd_G11x7y0 = {  "G11x7y0", // class name
  bases_G11x7y0, 6,
  &(vtc_G11x7y0[0]), // expected_vtbl_contents
  &(vtt_G11x7y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y0),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y1  : virtual E11x7 , F1 {
  int ff;
  ~G11x7y1(); // tgen
  G11x7y1(); // tgen
};
//SIG(1 G11x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G11x7y1 ::~G11x7y1(){ note_dtor("G11x7y1", this);} // tgen
G11x7y1 ::G11x7y1(){ note_ctor("G11x7y1", this);} // tgen

static void Test_G11x7y1()
{
  extern Class_Descriptor cd_G11x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x7y1, buf);
    G11x7y1 *dp, &lv = *(dp=new (buf) G11x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y1)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x7y1");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x7y1");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(32,20), "G11x7y1");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(64,40), "G11x7y1");
    check_base_class_offset(lv, (E11x7*), ABISELECT(16,12), "G11x7y1");
    check_base_class_offset(lv, (F1*), 0, "G11x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x7y1.ff");
    test_class_info(&lv, &cd_G11x7y1);
    dp->~G11x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y1(Test_G11x7y1, "G11x7y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x7y1C1Ev();
extern void _ZN7G11x7y1D1Ev();
Name_Map name_map_G11x7y1[] = {
  NSPAIR(_ZN7G11x7y1C1Ev),
  NSPAIR(_ZN7G11x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x7y1[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x7y1[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x7y1[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G11x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y1[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y1[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y1[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y1[] = {
  {&(_ZTV7G11x7y1[7]),  7,22},
  {&(_ZTV7G11x7y1[14]),  14,22},
  {&(_ZTV7G11x7y1[18]),  18,22},
  {&(_ZTV7G11x7y1[21]),  21,22},
  {&(_tg__ZTV5E11x7__7G11x7y1[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y1[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y1[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x7y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y1[];
extern  VTBL_ENTRY _ZTV7G11x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y1[];
Class_Descriptor cd_G11x7y1 = {  "G11x7y1", // class name
  bases_G11x7y1, 6,
  &(vtc_G11x7y1[0]), // expected_vtbl_contents
  &(vtt_G11x7y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y1),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y2  : E11x7 , virtual F1 {
  int ff;
  ~G11x7y2(); // tgen
  G11x7y2(); // tgen
};
//SIG(1 G11x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x7y2 ::~G11x7y2(){ note_dtor("G11x7y2", this);} // tgen
G11x7y2 ::G11x7y2(){ note_ctor("G11x7y2", this);} // tgen

static void Test_G11x7y2()
{
  extern Class_Descriptor cd_G11x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x7y2, buf);
    G11x7y2 *dp, &lv = *(dp=new (buf) G11x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y2)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,20), "G11x7y2");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,28), "G11x7y2");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(16,12), "G11x7y2");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(48,32), "G11x7y2");
    check_base_class_offset(lv, (E11x7*), 0, "G11x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G11x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x7y2.ff");
    test_class_info(&lv, &cd_G11x7y2);
    dp->~G11x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y2(Test_G11x7y2, "G11x7y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x7y2C1Ev();
extern void _ZN7G11x7y2D1Ev();
Name_Map name_map_G11x7y2[] = {
  NSPAIR(_ZN7G11x7y2C1Ev),
  NSPAIR(_ZN7G11x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x7y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y2[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x7y2[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G11x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y2[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y2[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y2[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y2[] = {
  {&(_ZTV7G11x7y2[7]),  7,19},
  {&(_tg__ZTV5E11x7__7G11x7y2[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y2[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y2[3]),  3,4},
  {&(_ZTV7G11x7y2[11]),  11,19},
  {&(_ZTV7G11x7y2[14]),  14,19},
  {&(_ZTV7G11x7y2[18]),  18,19},
  {&(_tg__ZTV3C11__7G11x7y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y2[];
extern  VTBL_ENTRY _ZTV7G11x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y2[];
Class_Descriptor cd_G11x7y2 = {  "G11x7y2", // class name
  bases_G11x7y2, 6,
  &(vtc_G11x7y2[0]), // expected_vtbl_contents
  &(vtt_G11x7y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y2),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y3  : virtual E11x7 , virtual F1 {
  int ff;
  ~G11x7y3(); // tgen
  G11x7y3(); // tgen
};
//SIG(1 G11x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G11x7y3 ::~G11x7y3(){ note_dtor("G11x7y3", this);} // tgen
G11x7y3 ::G11x7y3(){ note_ctor("G11x7y3", this);} // tgen

static void Test_G11x7y3()
{
  extern Class_Descriptor cd_G11x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G11x7y3, buf);
    G11x7y3 *dp, &lv = *(dp=new (buf) G11x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G11x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y3)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,24), "G11x7y3");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,32), "G11x7y3");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(32,16), "G11x7y3");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(64,36), "G11x7y3");
    check_base_class_offset(lv, (E11x7*), ABISELECT(16,8), "G11x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G11x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x7y3.ff");
    test_class_info(&lv, &cd_G11x7y3);
    dp->~G11x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y3(Test_G11x7y3, "G11x7y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G11x7y3C1Ev();
extern void _ZN7G11x7y3D1Ev();
Name_Map name_map_G11x7y3[] = {
  NSPAIR(_ZN7G11x7y3C1Ev),
  NSPAIR(_ZN7G11x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G11x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G11x7y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y3[0]),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x7y3[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G11x7y3[0]),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G11x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G11x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y3[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y3[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y3[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y3[] = {
  {&(_ZTV7G11x7y3[8]),  8,26},
  {&(_ZTV7G11x7y3[14]),  14,26},
  {&(_ZTV7G11x7y3[18]),  18,26},
  {&(_ZTV7G11x7y3[21]),  21,26},
  {&(_ZTV7G11x7y3[25]),  25,26},
  {&(_tg__ZTV5E11x7__7G11x7y3[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y3[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y3[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x7y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y3[];
extern  VTBL_ENTRY _ZTV7G11x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y3[];
Class_Descriptor cd_G11x7y3 = {  "G11x7y3", // class name
  bases_G11x7y3, 6,
  &(vtc_G11x7y3[0]), // expected_vtbl_contents
  &(vtt_G11x7y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G11x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y3),26, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y4  : E11x7 , F0 {
  int ff;
  ~G11x7y4(); // tgen
  G11x7y4(); // tgen
};
//SIG(1 G11x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G11x7y4 ::~G11x7y4(){ note_dtor("G11x7y4", this);} // tgen
G11x7y4 ::G11x7y4(){ note_ctor("G11x7y4", this);} // tgen

static void Test_G11x7y4()
{
  extern Class_Descriptor cd_G11x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G11x7y4, buf);
    G11x7y4 *dp, &lv = *(dp=new (buf) G11x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G11x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y4)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(40,24), "G11x7y4");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(52,32), "G11x7y4");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(24,16), "G11x7y4");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(56,36), "G11x7y4");
    check_base_class_offset(lv, (E11x7*), 0, "G11x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G11x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G11x7y4.ff");
    test_class_info(&lv, &cd_G11x7y4);
    dp->~G11x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y4(Test_G11x7y4, "G11x7y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G11x7y4C1Ev();
extern void _ZN7G11x7y4D1Ev();
Name_Map name_map_G11x7y4[] = {
  NSPAIR(_ZN7G11x7y4C1Ev),
  NSPAIR(_ZN7G11x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y4[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y4[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G11x7y4[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G11x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y4[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y4[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y4[] = {
  {&(_ZTV7G11x7y4[6]),  6,14},
  {&(_tg__ZTV5E11x7__7G11x7y4[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y4[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y4[3]),  3,4},
  {&(_ZTV7G11x7y4[10]),  10,14},
  {&(_ZTV7G11x7y4[13]),  13,14},
  {&(_tg__ZTV3C11__7G11x7y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y4[];
extern  VTBL_ENTRY _ZTV7G11x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y4[];
Class_Descriptor cd_G11x7y4 = {  "G11x7y4", // class name
  bases_G11x7y4, 6,
  &(vtc_G11x7y4[0]), // expected_vtbl_contents
  &(vtt_G11x7y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G11x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y4),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y5  : virtual E11x7 , F0 {
  int ff;
  ~G11x7y5(); // tgen
  G11x7y5(); // tgen
};
//SIG(1 G11x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G11x7y5 ::~G11x7y5(){ note_dtor("G11x7y5", this);} // tgen
G11x7y5 ::G11x7y5(){ note_ctor("G11x7y5", this);} // tgen

static void Test_G11x7y5()
{
  extern Class_Descriptor cd_G11x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x7y5, buf);
    G11x7y5 *dp, &lv = *(dp=new (buf) G11x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y5)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,28), "G11x7y5");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,36), "G11x7y5");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(32,20), "G11x7y5");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(64,40), "G11x7y5");
    check_base_class_offset(lv, (E11x7*), ABISELECT(16,12), "G11x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G11x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x7y5.ff");
    test_class_info(&lv, &cd_G11x7y5);
    dp->~G11x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y5(Test_G11x7y5, "G11x7y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x7y5C1Ev();
extern void _ZN7G11x7y5D1Ev();
Name_Map name_map_G11x7y5[] = {
  NSPAIR(_ZN7G11x7y5C1Ev),
  NSPAIR(_ZN7G11x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y5[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x7y5[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y5[0]),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x7y5[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x7y5[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G11x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y5[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y5[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y5[] = {
  {&(_ZTV7G11x7y5[7]),  7,21},
  {&(_ZTV7G11x7y5[13]),  13,21},
  {&(_ZTV7G11x7y5[17]),  17,21},
  {&(_ZTV7G11x7y5[20]),  20,21},
  {&(_tg__ZTV5E11x7__7G11x7y5[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y5[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y5[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x7y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y5[];
extern  VTBL_ENTRY _ZTV7G11x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y5[];
Class_Descriptor cd_G11x7y5 = {  "G11x7y5", // class name
  bases_G11x7y5, 6,
  &(vtc_G11x7y5[0]), // expected_vtbl_contents
  &(vtt_G11x7y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y5),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y6  : E11x7 , virtual F0 {
  int ff;
  ~G11x7y6(); // tgen
  G11x7y6(); // tgen
};
//SIG(1 G11x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x7y6 ::~G11x7y6(){ note_dtor("G11x7y6", this);} // tgen
G11x7y6 ::G11x7y6(){ note_ctor("G11x7y6", this);} // tgen

static void Test_G11x7y6()
{
  extern Class_Descriptor cd_G11x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G11x7y6, buf);
    G11x7y6 *dp, &lv = *(dp=new (buf) G11x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G11x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y6)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(32,20), "G11x7y6");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(44,28), "G11x7y6");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(16,12), "G11x7y6");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(48,32), "G11x7y6");
    check_base_class_offset(lv, (E11x7*), 0, "G11x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G11x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G11x7y6.ff");
    test_class_info(&lv, &cd_G11x7y6);
    dp->~G11x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y6(Test_G11x7y6, "G11x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G11x7y6C1Ev();
extern void _ZN7G11x7y6D1Ev();
Name_Map name_map_G11x7y6[] = {
  NSPAIR(_ZN7G11x7y6C1Ev),
  NSPAIR(_ZN7G11x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y6[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x7y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y6[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G11x7y6[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G11x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y6[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y6[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y6[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y6[] = {
  {&(_ZTV7G11x7y6[7]),  7,15},
  {&(_tg__ZTV5E11x7__7G11x7y6[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y6[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y6[3]),  3,4},
  {&(_ZTV7G11x7y6[11]),  11,15},
  {&(_ZTV7G11x7y6[14]),  14,15},
  {&(_tg__ZTV3C11__7G11x7y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y6[];
extern  VTBL_ENTRY _ZTV7G11x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y6[];
Class_Descriptor cd_G11x7y6 = {  "G11x7y6", // class name
  bases_G11x7y6, 6,
  &(vtc_G11x7y6[0]), // expected_vtbl_contents
  &(vtt_G11x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G11x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y6),15, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G11x7y7  : virtual E11x7 , virtual F0 {
  int ff;
  ~G11x7y7(); // tgen
  G11x7y7(); // tgen
};
//SIG(1 G11x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G11x7y7 ::~G11x7y7(){ note_dtor("G11x7y7", this);} // tgen
G11x7y7 ::G11x7y7(){ note_ctor("G11x7y7", this);} // tgen

static void Test_G11x7y7()
{
  extern Class_Descriptor cd_G11x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G11x7y7, buf);
    G11x7y7 *dp, &lv = *(dp=new (buf) G11x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G11x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G11x7y7)");
    check_base_class_offset(lv, (A1*)(C11*), ABISELECT(48,24), "G11x7y7");
    check_base_class_offset(lv, (B0*)(C11*), ABISELECT(60,32), "G11x7y7");
    check_base_class_offset(lv, (C11*)(E11x7*), ABISELECT(32,16), "G11x7y7");
    check_base_class_offset(lv, (D0*)(E11x7*), ABISELECT(64,36), "G11x7y7");
    check_base_class_offset(lv, (E11x7*), ABISELECT(16,8), "G11x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G11x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G11x7y7.ff");
    test_class_info(&lv, &cd_G11x7y7);
    dp->~G11x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG11x7y7(Test_G11x7y7, "G11x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G11x7y7C1Ev();
extern void _ZN7G11x7y7D1Ev();
Name_Map name_map_G11x7y7[] = {
  NSPAIR(_ZN7G11x7y7C1Ev),
  NSPAIR(_ZN7G11x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C11;
extern VTBL_ENTRY _ZTI3C11[];
extern  VTBL_ENTRY _ZTV3C11[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C11[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E11x7;
extern VTBL_ENTRY _ZTI5E11x7[];
extern  VTBL_ENTRY _ZTV5E11x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E11x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G11x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C11,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E11x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G11x7y7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY vtc_G11x7y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G11x7y7[0]),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G11x7y7[0]),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G11x7y7[0]),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G11x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern VTBL_ENTRY _ZTV7G11x7y7[];
static  VTBL_ENTRY _tg__ZTV5E11x7__7G11x7y7[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C11__5E11x7__7G11x7y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E11x7__7G11x7y7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E11x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C11__7G11x7y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C11[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C11__7G11x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C11[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
static  VTT_ENTRY vtt_G11x7y7[] = {
  {&(_ZTV7G11x7y7[8]),  8,22},
  {&(_ZTV7G11x7y7[14]),  14,22},
  {&(_ZTV7G11x7y7[18]),  18,22},
  {&(_ZTV7G11x7y7[21]),  21,22},
  {&(_tg__ZTV5E11x7__7G11x7y7[6]),  6,6},
  {&(_tg__ZTV3C11__5E11x7__7G11x7y7[4]),  4,4},
  {&(_tg__ZTV2A1__5E11x7__7G11x7y7[3]),  3,4},
  {&(_tg__ZTV3C11__7G11x7y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C11__7G11x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G11x7y7[];
extern  VTBL_ENTRY _ZTV7G11x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G11x7y7[];
Class_Descriptor cd_G11x7y7 = {  "G11x7y7", // class name
  bases_G11x7y7, 6,
  &(vtc_G11x7y7[0]), // expected_vtbl_contents
  &(vtt_G11x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G11x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G11x7y7),22, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G11x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E12x7  : virtual C12 , virtual D0 {
  int fd;
  ~E12x7(); // tgen
  E12x7(); // tgen
};
//SIG(-1 E12x7) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E12x7 ::~E12x7(){ note_dtor("E12x7", this);} // tgen
E12x7 ::E12x7(){ note_ctor("E12x7", this);} // tgen

static void Test_E12x7()
{
  extern Class_Descriptor cd_E12x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E12x7, buf);
    E12x7 *dp, &lv = *(dp=new (buf) E12x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E12x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E12x7)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,12), "E12x7");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,20), "E12x7");
    check_base_class_offset(lv, (C12*), ABISELECT(16,8), "E12x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E12x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E12x7.fd");
    test_class_info(&lv, &cd_E12x7);
    dp->~E12x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE12x7(Test_E12x7, "E12x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E12x7C1Ev();
extern void _ZN5E12x7D1Ev();
Name_Map name_map_E12x7[] = {
  NSPAIR(_ZN5E12x7C1Ev),
  NSPAIR(_ZN5E12x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E12x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E12x7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E12x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E12x7[];
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__5E12x7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E12x7[] = {
  {&(_ZTV5E12x7[5]),  5,12},
  {&(_ZTV5E12x7[8]),  8,12},
  {&(_ZTV5E12x7[11]),  11,12},
  {&(_tg__ZTV3C12__5E12x7[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__5E12x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
Class_Descriptor cd_E12x7 = {  "E12x7", // class name
  bases_E12x7, 4,
  &(vtc_E12x7[0]), // expected_vtbl_contents
  &(vtt_E12x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E12x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E12x7),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E12x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y0  : E12x7 , F1 {
  int ff;
  ~G12x7y0(); // tgen
  G12x7y0(); // tgen
};
//SIG(1 G12x7y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x7y0 ::~G12x7y0(){ note_dtor("G12x7y0", this);} // tgen
G12x7y0 ::G12x7y0(){ note_ctor("G12x7y0", this);} // tgen

static void Test_G12x7y0()
{
  extern Class_Descriptor cd_G12x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x7y0, buf);
    G12x7y0 *dp, &lv = *(dp=new (buf) G12x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y0)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x7y0");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x7y0");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(32,20), "G12x7y0");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(60,40), "G12x7y0");
    check_base_class_offset(lv, (E12x7*), 0, "G12x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G12x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G12x7y0.ff");
    test_class_info(&lv, &cd_G12x7y0);
    dp->~G12x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y0(Test_G12x7y0, "G12x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x7y0C1Ev();
extern void _ZN7G12x7y0D1Ev();
Name_Map name_map_G12x7y0[] = {
  NSPAIR(_ZN7G12x7y0C1Ev),
  NSPAIR(_ZN7G12x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G12x7y0[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G12x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y0[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y0[] = {
  {&(_ZTV7G12x7y0[5]),  5,15},
  {&(_tg__ZTV5E12x7__7G12x7y0[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y0[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y0[3]),  3,4},
  {&(_ZTV7G12x7y0[11]),  11,15},
  {&(_ZTV7G12x7y0[14]),  14,15},
  {&(_tg__ZTV3C12__7G12x7y0[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y0[];
extern  VTBL_ENTRY _ZTV7G12x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y0[];
Class_Descriptor cd_G12x7y0 = {  "G12x7y0", // class name
  bases_G12x7y0, 6,
  &(vtc_G12x7y0[0]), // expected_vtbl_contents
  &(vtt_G12x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y0),15, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y1  : virtual E12x7 , F1 {
  int ff;
  ~G12x7y1(); // tgen
  G12x7y1(); // tgen
};
//SIG(1 G12x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G12x7y1 ::~G12x7y1(){ note_dtor("G12x7y1", this);} // tgen
G12x7y1 ::G12x7y1(){ note_ctor("G12x7y1", this);} // tgen

static void Test_G12x7y1()
{
  extern Class_Descriptor cd_G12x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x7y1, buf);
    G12x7y1 *dp, &lv = *(dp=new (buf) G12x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y1)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x7y1");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x7y1");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(32,20), "G12x7y1");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(60,40), "G12x7y1");
    check_base_class_offset(lv, (E12x7*), ABISELECT(16,12), "G12x7y1");
    check_base_class_offset(lv, (F1*), 0, "G12x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x7y1.ff");
    test_class_info(&lv, &cd_G12x7y1);
    dp->~G12x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y1(Test_G12x7y1, "G12x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x7y1C1Ev();
extern void _ZN7G12x7y1D1Ev();
Name_Map name_map_G12x7y1[] = {
  NSPAIR(_ZN7G12x7y1C1Ev),
  NSPAIR(_ZN7G12x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x7y1[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G12x7y1[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G12x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y1[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y1[] = {
  {&(_ZTV7G12x7y1[6]),  6,19},
  {&(_ZTV7G12x7y1[12]),  12,19},
  {&(_ZTV7G12x7y1[15]),  15,19},
  {&(_ZTV7G12x7y1[18]),  18,19},
  {&(_tg__ZTV5E12x7__7G12x7y1[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y1[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y1[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x7y1[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y1[];
extern  VTBL_ENTRY _ZTV7G12x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y1[];
Class_Descriptor cd_G12x7y1 = {  "G12x7y1", // class name
  bases_G12x7y1, 6,
  &(vtc_G12x7y1[0]), // expected_vtbl_contents
  &(vtt_G12x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y1),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y2  : E12x7 , virtual F1 {
  int ff;
  ~G12x7y2(); // tgen
  G12x7y2(); // tgen
};
//SIG(1 G12x7y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x7y2 ::~G12x7y2(){ note_dtor("G12x7y2", this);} // tgen
G12x7y2 ::G12x7y2(){ note_ctor("G12x7y2", this);} // tgen

static void Test_G12x7y2()
{
  extern Class_Descriptor cd_G12x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x7y2, buf);
    G12x7y2 *dp, &lv = *(dp=new (buf) G12x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y2)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,16), "G12x7y2");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,24), "G12x7y2");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(16,12), "G12x7y2");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(44,32), "G12x7y2");
    check_base_class_offset(lv, (E12x7*), 0, "G12x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G12x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x7y2.ff");
    test_class_info(&lv, &cd_G12x7y2);
    dp->~G12x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y2(Test_G12x7y2, "G12x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x7y2C1Ev();
extern void _ZN7G12x7y2D1Ev();
Name_Map name_map_G12x7y2[] = {
  NSPAIR(_ZN7G12x7y2C1Ev),
  NSPAIR(_ZN7G12x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y2[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x7y2[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G12x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y2[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y2[] = {
  {&(_ZTV7G12x7y2[6]),  6,17},
  {&(_tg__ZTV5E12x7__7G12x7y2[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y2[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y2[3]),  3,4},
  {&(_ZTV7G12x7y2[9]),  9,17},
  {&(_ZTV7G12x7y2[12]),  12,17},
  {&(_ZTV7G12x7y2[16]),  16,17},
  {&(_tg__ZTV3C12__7G12x7y2[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y2[];
extern  VTBL_ENTRY _ZTV7G12x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y2[];
Class_Descriptor cd_G12x7y2 = {  "G12x7y2", // class name
  bases_G12x7y2, 6,
  &(vtc_G12x7y2[0]), // expected_vtbl_contents
  &(vtt_G12x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y2),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y3  : virtual E12x7 , virtual F1 {
  int ff;
  ~G12x7y3(); // tgen
  G12x7y3(); // tgen
};
//SIG(1 G12x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G12x7y3 ::~G12x7y3(){ note_dtor("G12x7y3", this);} // tgen
G12x7y3 ::G12x7y3(){ note_ctor("G12x7y3", this);} // tgen

static void Test_G12x7y3()
{
  extern Class_Descriptor cd_G12x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G12x7y3, buf);
    G12x7y3 *dp, &lv = *(dp=new (buf) G12x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G12x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y3)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,20), "G12x7y3");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,28), "G12x7y3");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(32,16), "G12x7y3");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(60,36), "G12x7y3");
    check_base_class_offset(lv, (E12x7*), ABISELECT(16,8), "G12x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G12x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x7y3.ff");
    test_class_info(&lv, &cd_G12x7y3);
    dp->~G12x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y3(Test_G12x7y3, "G12x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G12x7y3C1Ev();
extern void _ZN7G12x7y3D1Ev();
Name_Map name_map_G12x7y3[] = {
  NSPAIR(_ZN7G12x7y3C1Ev),
  NSPAIR(_ZN7G12x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G12x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G12x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x7y3[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G12x7y3[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G12x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G12x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y3[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y3[] = {
  {&(_ZTV7G12x7y3[7]),  7,23},
  {&(_ZTV7G12x7y3[12]),  12,23},
  {&(_ZTV7G12x7y3[15]),  15,23},
  {&(_ZTV7G12x7y3[18]),  18,23},
  {&(_ZTV7G12x7y3[22]),  22,23},
  {&(_tg__ZTV5E12x7__7G12x7y3[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y3[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y3[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x7y3[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y3[];
extern  VTBL_ENTRY _ZTV7G12x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y3[];
Class_Descriptor cd_G12x7y3 = {  "G12x7y3", // class name
  bases_G12x7y3, 6,
  &(vtc_G12x7y3[0]), // expected_vtbl_contents
  &(vtt_G12x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G12x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y3),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y4  : E12x7 , F0 {
  int ff;
  ~G12x7y4(); // tgen
  G12x7y4(); // tgen
};
//SIG(1 G12x7y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G12x7y4 ::~G12x7y4(){ note_dtor("G12x7y4", this);} // tgen
G12x7y4 ::G12x7y4(){ note_ctor("G12x7y4", this);} // tgen

static void Test_G12x7y4()
{
  extern Class_Descriptor cd_G12x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x7y4, buf);
    G12x7y4 *dp, &lv = *(dp=new (buf) G12x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y4)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(32,20), "G12x7y4");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(40,28), "G12x7y4");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(24,16), "G12x7y4");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(52,36), "G12x7y4");
    check_base_class_offset(lv, (E12x7*), 0, "G12x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G12x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G12x7y4.ff");
    test_class_info(&lv, &cd_G12x7y4);
    dp->~G12x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y4(Test_G12x7y4, "G12x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x7y4C1Ev();
extern void _ZN7G12x7y4D1Ev();
Name_Map name_map_G12x7y4[] = {
  NSPAIR(_ZN7G12x7y4C1Ev),
  NSPAIR(_ZN7G12x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    8, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y4[0]),
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G12x7y4[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G12x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y4[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y4[] = {
  {&(_ZTV7G12x7y4[5]),  5,12},
  {&(_tg__ZTV5E12x7__7G12x7y4[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y4[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y4[3]),  3,4},
  {&(_ZTV7G12x7y4[8]),  8,12},
  {&(_ZTV7G12x7y4[11]),  11,12},
  {&(_tg__ZTV3C12__7G12x7y4[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y4[];
extern  VTBL_ENTRY _ZTV7G12x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y4[];
Class_Descriptor cd_G12x7y4 = {  "G12x7y4", // class name
  bases_G12x7y4, 6,
  &(vtc_G12x7y4[0]), // expected_vtbl_contents
  &(vtt_G12x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y4),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y5  : virtual E12x7 , F0 {
  int ff;
  ~G12x7y5(); // tgen
  G12x7y5(); // tgen
};
//SIG(1 G12x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G12x7y5 ::~G12x7y5(){ note_dtor("G12x7y5", this);} // tgen
G12x7y5 ::G12x7y5(){ note_ctor("G12x7y5", this);} // tgen

static void Test_G12x7y5()
{
  extern Class_Descriptor cd_G12x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G12x7y5, buf);
    G12x7y5 *dp, &lv = *(dp=new (buf) G12x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G12x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y5)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,24), "G12x7y5");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,32), "G12x7y5");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(32,20), "G12x7y5");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(60,40), "G12x7y5");
    check_base_class_offset(lv, (E12x7*), ABISELECT(16,12), "G12x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G12x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x7y5.ff");
    test_class_info(&lv, &cd_G12x7y5);
    dp->~G12x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y5(Test_G12x7y5, "G12x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G12x7y5C1Ev();
extern void _ZN7G12x7y5D1Ev();
Name_Map name_map_G12x7y5[] = {
  NSPAIR(_ZN7G12x7y5C1Ev),
  NSPAIR(_ZN7G12x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x7y5[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G12x7y5[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G12x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y5[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y5[] = {
  {&(_ZTV7G12x7y5[6]),  6,18},
  {&(_ZTV7G12x7y5[11]),  11,18},
  {&(_ZTV7G12x7y5[14]),  14,18},
  {&(_ZTV7G12x7y5[17]),  17,18},
  {&(_tg__ZTV5E12x7__7G12x7y5[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y5[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y5[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x7y5[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y5[];
extern  VTBL_ENTRY _ZTV7G12x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y5[];
Class_Descriptor cd_G12x7y5 = {  "G12x7y5", // class name
  bases_G12x7y5, 6,
  &(vtc_G12x7y5[0]), // expected_vtbl_contents
  &(vtt_G12x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G12x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y5),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y6  : E12x7 , virtual F0 {
  int ff;
  ~G12x7y6(); // tgen
  G12x7y6(); // tgen
};
//SIG(1 G12x7y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x7y6 ::~G12x7y6(){ note_dtor("G12x7y6", this);} // tgen
G12x7y6 ::G12x7y6(){ note_ctor("G12x7y6", this);} // tgen

static void Test_G12x7y6()
{
  extern Class_Descriptor cd_G12x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G12x7y6, buf);
    G12x7y6 *dp, &lv = *(dp=new (buf) G12x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G12x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y6)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(24,16), "G12x7y6");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(32,24), "G12x7y6");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(16,12), "G12x7y6");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(44,32), "G12x7y6");
    check_base_class_offset(lv, (E12x7*), 0, "G12x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G12x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G12x7y6.ff");
    test_class_info(&lv, &cd_G12x7y6);
    dp->~G12x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y6(Test_G12x7y6, "G12x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G12x7y6C1Ev();
extern void _ZN7G12x7y6D1Ev();
Name_Map name_map_G12x7y6[] = {
  NSPAIR(_ZN7G12x7y6C1Ev),
  NSPAIR(_ZN7G12x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y6[0]),
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G12x7y6[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G12x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y6[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y6[] = {
  {&(_ZTV7G12x7y6[6]),  6,13},
  {&(_tg__ZTV5E12x7__7G12x7y6[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y6[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y6[3]),  3,4},
  {&(_ZTV7G12x7y6[9]),  9,13},
  {&(_ZTV7G12x7y6[12]),  12,13},
  {&(_tg__ZTV3C12__7G12x7y6[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y6[];
extern  VTBL_ENTRY _ZTV7G12x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y6[];
Class_Descriptor cd_G12x7y6 = {  "G12x7y6", // class name
  bases_G12x7y6, 6,
  &(vtc_G12x7y6[0]), // expected_vtbl_contents
  &(vtt_G12x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G12x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y6),13, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G12x7y7  : virtual E12x7 , virtual F0 {
  int ff;
  ~G12x7y7(); // tgen
  G12x7y7(); // tgen
};
//SIG(1 G12x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G12x7y7 ::~G12x7y7(){ note_dtor("G12x7y7", this);} // tgen
G12x7y7 ::G12x7y7(){ note_ctor("G12x7y7", this);} // tgen

static void Test_G12x7y7()
{
  extern Class_Descriptor cd_G12x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G12x7y7, buf);
    G12x7y7 *dp, &lv = *(dp=new (buf) G12x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G12x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G12x7y7)");
    check_base_class_offset(lv, (A0*)(C12*), ABISELECT(40,20), "G12x7y7");
    check_base_class_offset(lv, (B1*)(C12*), ABISELECT(48,28), "G12x7y7");
    check_base_class_offset(lv, (C12*)(E12x7*), ABISELECT(32,16), "G12x7y7");
    check_base_class_offset(lv, (D0*)(E12x7*), ABISELECT(60,36), "G12x7y7");
    check_base_class_offset(lv, (E12x7*), ABISELECT(16,8), "G12x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G12x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G12x7y7.ff");
    test_class_info(&lv, &cd_G12x7y7);
    dp->~G12x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG12x7y7(Test_G12x7y7, "G12x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G12x7y7C1Ev();
extern void _ZN7G12x7y7D1Ev();
Name_Map name_map_G12x7y7[] = {
  NSPAIR(_ZN7G12x7y7C1Ev),
  NSPAIR(_ZN7G12x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C12;
extern VTBL_ENTRY _ZTI3C12[];
extern  VTBL_ENTRY _ZTV3C12[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C12[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E12x7;
extern VTBL_ENTRY _ZTI5E12x7[];
extern  VTBL_ENTRY _ZTV5E12x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E12x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G12x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C12,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E12x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G12x7y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G12x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G12x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G12x7y7[0]),
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G12x7y7[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G12x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G12x7y7[];
static  VTBL_ENTRY _tg__ZTV5E12x7__7G12x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C12__5E12x7__7G12x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E12x7__7G12x7y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E12x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C12__7G12x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C12[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C12__7G12x7y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C12[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G12x7y7[] = {
  {&(_ZTV7G12x7y7[7]),  7,19},
  {&(_ZTV7G12x7y7[12]),  12,19},
  {&(_ZTV7G12x7y7[15]),  15,19},
  {&(_ZTV7G12x7y7[18]),  18,19},
  {&(_tg__ZTV5E12x7__7G12x7y7[5]),  5,5},
  {&(_tg__ZTV3C12__5E12x7__7G12x7y7[3]),  3,3},
  {&(_tg__ZTV2B1__5E12x7__7G12x7y7[3]),  3,4},
  {&(_tg__ZTV3C12__7G12x7y7[3]),  3,3},
  {&(_tg__ZTV2B1__3C12__7G12x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G12x7y7[];
extern  VTBL_ENTRY _ZTV7G12x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G12x7y7[];
Class_Descriptor cd_G12x7y7 = {  "G12x7y7", // class name
  bases_G12x7y7, 6,
  &(vtc_G12x7y7[0]), // expected_vtbl_contents
  &(vtt_G12x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G12x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G12x7y7),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G12x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E13x7  : virtual C13 , virtual D0 {
  int fd;
  ~E13x7(); // tgen
  E13x7(); // tgen
};
//SIG(-1 E13x7) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E13x7 ::~E13x7(){ note_dtor("E13x7", this);} // tgen
E13x7 ::E13x7(){ note_ctor("E13x7", this);} // tgen

static void Test_E13x7()
{
  extern Class_Descriptor cd_E13x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E13x7, buf);
    E13x7 *dp, &lv = *(dp=new (buf) E13x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E13x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E13x7)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,8), "E13x7");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,20), "E13x7");
    check_base_class_offset(lv, (C13*), ABISELECT(16,8), "E13x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E13x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E13x7.fd");
    test_class_info(&lv, &cd_E13x7);
    dp->~E13x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE13x7(Test_E13x7, "E13x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E13x7C1Ev();
extern void _ZN5E13x7D1Ev();
Name_Map name_map_E13x7[] = {
  NSPAIR(_ZN5E13x7C1Ev),
  NSPAIR(_ZN5E13x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E13x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E13x7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E13x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E13x7[];
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__5E13x7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E13x7[] = {
  {&(_ZTV5E13x7[5]),  5,14},
  {&(_ZTV5E13x7[9]),  9,14},
  {&(_ZTV5E13x7[13]),  13,14},
  {&(_tg__ZTV3C13__5E13x7[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__5E13x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
Class_Descriptor cd_E13x7 = {  "E13x7", // class name
  bases_E13x7, 4,
  &(vtc_E13x7[0]), // expected_vtbl_contents
  &(vtt_E13x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E13x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E13x7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E13x7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y0  : E13x7 , F1 {
  int ff;
  ~G13x7y0(); // tgen
  G13x7y0(); // tgen
};
//SIG(1 G13x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x7y0 ::~G13x7y0(){ note_dtor("G13x7y0", this);} // tgen
G13x7y0 ::G13x7y0(){ note_ctor("G13x7y0", this);} // tgen

static void Test_G13x7y0()
{
  extern Class_Descriptor cd_G13x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x7y0, buf);
    G13x7y0 *dp, &lv = *(dp=new (buf) G13x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y0)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x7y0");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x7y0");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(32,20), "G13x7y0");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(60,40), "G13x7y0");
    check_base_class_offset(lv, (E13x7*), 0, "G13x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G13x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G13x7y0.ff");
    test_class_info(&lv, &cd_G13x7y0);
    dp->~G13x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y0(Test_G13x7y0, "G13x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x7y0C1Ev();
extern void _ZN7G13x7y0D1Ev();
Name_Map name_map_G13x7y0[] = {
  NSPAIR(_ZN7G13x7y0C1Ev),
  NSPAIR(_ZN7G13x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G13x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G13x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y0[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y0[] = {
  {&(_ZTV7G13x7y0[5]),  5,17},
  {&(_tg__ZTV5E13x7__7G13x7y0[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y0[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y0[3]),  3,4},
  {&(_ZTV7G13x7y0[12]),  12,17},
  {&(_ZTV7G13x7y0[16]),  16,17},
  {&(_tg__ZTV3C13__7G13x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y0[];
extern  VTBL_ENTRY _ZTV7G13x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y0[];
Class_Descriptor cd_G13x7y0 = {  "G13x7y0", // class name
  bases_G13x7y0, 6,
  &(vtc_G13x7y0[0]), // expected_vtbl_contents
  &(vtt_G13x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y1  : virtual E13x7 , F1 {
  int ff;
  ~G13x7y1(); // tgen
  G13x7y1(); // tgen
};
//SIG(1 G13x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G13x7y1 ::~G13x7y1(){ note_dtor("G13x7y1", this);} // tgen
G13x7y1 ::G13x7y1(){ note_ctor("G13x7y1", this);} // tgen

static void Test_G13x7y1()
{
  extern Class_Descriptor cd_G13x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x7y1, buf);
    G13x7y1 *dp, &lv = *(dp=new (buf) G13x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y1)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x7y1");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x7y1");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(32,20), "G13x7y1");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(60,40), "G13x7y1");
    check_base_class_offset(lv, (E13x7*), ABISELECT(16,12), "G13x7y1");
    check_base_class_offset(lv, (F1*), 0, "G13x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x7y1.ff");
    test_class_info(&lv, &cd_G13x7y1);
    dp->~G13x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y1(Test_G13x7y1, "G13x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x7y1C1Ev();
extern void _ZN7G13x7y1D1Ev();
Name_Map name_map_G13x7y1[] = {
  NSPAIR(_ZN7G13x7y1C1Ev),
  NSPAIR(_ZN7G13x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G13x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G13x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y1[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y1[] = {
  {&(_ZTV7G13x7y1[6]),  6,21},
  {&(_ZTV7G13x7y1[12]),  12,21},
  {&(_ZTV7G13x7y1[16]),  16,21},
  {&(_ZTV7G13x7y1[20]),  20,21},
  {&(_tg__ZTV5E13x7__7G13x7y1[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y1[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y1[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y1[];
extern  VTBL_ENTRY _ZTV7G13x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y1[];
Class_Descriptor cd_G13x7y1 = {  "G13x7y1", // class name
  bases_G13x7y1, 6,
  &(vtc_G13x7y1[0]), // expected_vtbl_contents
  &(vtt_G13x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y2  : E13x7 , virtual F1 {
  int ff;
  ~G13x7y2(); // tgen
  G13x7y2(); // tgen
};
//SIG(1 G13x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x7y2 ::~G13x7y2(){ note_dtor("G13x7y2", this);} // tgen
G13x7y2 ::G13x7y2(){ note_ctor("G13x7y2", this);} // tgen

static void Test_G13x7y2()
{
  extern Class_Descriptor cd_G13x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x7y2, buf);
    G13x7y2 *dp, &lv = *(dp=new (buf) G13x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y2)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,12), "G13x7y2");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,24), "G13x7y2");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(16,12), "G13x7y2");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(44,32), "G13x7y2");
    check_base_class_offset(lv, (E13x7*), 0, "G13x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G13x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x7y2.ff");
    test_class_info(&lv, &cd_G13x7y2);
    dp->~G13x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y2(Test_G13x7y2, "G13x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x7y2C1Ev();
extern void _ZN7G13x7y2D1Ev();
Name_Map name_map_G13x7y2[] = {
  NSPAIR(_ZN7G13x7y2C1Ev),
  NSPAIR(_ZN7G13x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G13x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y2[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y2[] = {
  {&(_ZTV7G13x7y2[6]),  6,19},
  {&(_tg__ZTV5E13x7__7G13x7y2[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y2[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y2[3]),  3,4},
  {&(_ZTV7G13x7y2[10]),  10,19},
  {&(_ZTV7G13x7y2[14]),  14,19},
  {&(_ZTV7G13x7y2[18]),  18,19},
  {&(_tg__ZTV3C13__7G13x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y2[];
extern  VTBL_ENTRY _ZTV7G13x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y2[];
Class_Descriptor cd_G13x7y2 = {  "G13x7y2", // class name
  bases_G13x7y2, 6,
  &(vtc_G13x7y2[0]), // expected_vtbl_contents
  &(vtt_G13x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y3  : virtual E13x7 , virtual F1 {
  int ff;
  ~G13x7y3(); // tgen
  G13x7y3(); // tgen
};
//SIG(1 G13x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G13x7y3 ::~G13x7y3(){ note_dtor("G13x7y3", this);} // tgen
G13x7y3 ::G13x7y3(){ note_ctor("G13x7y3", this);} // tgen

static void Test_G13x7y3()
{
  extern Class_Descriptor cd_G13x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G13x7y3, buf);
    G13x7y3 *dp, &lv = *(dp=new (buf) G13x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G13x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y3)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,16), "G13x7y3");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,28), "G13x7y3");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(32,16), "G13x7y3");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(60,36), "G13x7y3");
    check_base_class_offset(lv, (E13x7*), ABISELECT(16,8), "G13x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G13x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x7y3.ff");
    test_class_info(&lv, &cd_G13x7y3);
    dp->~G13x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y3(Test_G13x7y3, "G13x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G13x7y3C1Ev();
extern void _ZN7G13x7y3D1Ev();
Name_Map name_map_G13x7y3[] = {
  NSPAIR(_ZN7G13x7y3C1Ev),
  NSPAIR(_ZN7G13x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G13x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G13x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G13x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G13x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G13x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y3[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y3[] = {
  {&(_ZTV7G13x7y3[7]),  7,25},
  {&(_ZTV7G13x7y3[12]),  12,25},
  {&(_ZTV7G13x7y3[16]),  16,25},
  {&(_ZTV7G13x7y3[20]),  20,25},
  {&(_ZTV7G13x7y3[24]),  24,25},
  {&(_tg__ZTV5E13x7__7G13x7y3[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y3[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y3[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y3[];
extern  VTBL_ENTRY _ZTV7G13x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y3[];
Class_Descriptor cd_G13x7y3 = {  "G13x7y3", // class name
  bases_G13x7y3, 6,
  &(vtc_G13x7y3[0]), // expected_vtbl_contents
  &(vtt_G13x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G13x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y4  : E13x7 , F0 {
  int ff;
  ~G13x7y4(); // tgen
  G13x7y4(); // tgen
};
//SIG(1 G13x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G13x7y4 ::~G13x7y4(){ note_dtor("G13x7y4", this);} // tgen
G13x7y4 ::G13x7y4(){ note_ctor("G13x7y4", this);} // tgen

static void Test_G13x7y4()
{
  extern Class_Descriptor cd_G13x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x7y4, buf);
    G13x7y4 *dp, &lv = *(dp=new (buf) G13x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y4)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(24,16), "G13x7y4");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(40,28), "G13x7y4");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(24,16), "G13x7y4");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(52,36), "G13x7y4");
    check_base_class_offset(lv, (E13x7*), 0, "G13x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G13x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G13x7y4.ff");
    test_class_info(&lv, &cd_G13x7y4);
    dp->~G13x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y4(Test_G13x7y4, "G13x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x7y4C1Ev();
extern void _ZN7G13x7y4D1Ev();
Name_Map name_map_G13x7y4[] = {
  NSPAIR(_ZN7G13x7y4C1Ev),
  NSPAIR(_ZN7G13x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G13x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G13x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y4[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y4[] = {
  {&(_ZTV7G13x7y4[5]),  5,14},
  {&(_tg__ZTV5E13x7__7G13x7y4[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y4[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y4[3]),  3,4},
  {&(_ZTV7G13x7y4[9]),  9,14},
  {&(_ZTV7G13x7y4[13]),  13,14},
  {&(_tg__ZTV3C13__7G13x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y4[];
extern  VTBL_ENTRY _ZTV7G13x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y4[];
Class_Descriptor cd_G13x7y4 = {  "G13x7y4", // class name
  bases_G13x7y4, 6,
  &(vtc_G13x7y4[0]), // expected_vtbl_contents
  &(vtt_G13x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y5  : virtual E13x7 , F0 {
  int ff;
  ~G13x7y5(); // tgen
  G13x7y5(); // tgen
};
//SIG(1 G13x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G13x7y5 ::~G13x7y5(){ note_dtor("G13x7y5", this);} // tgen
G13x7y5 ::G13x7y5(){ note_ctor("G13x7y5", this);} // tgen

static void Test_G13x7y5()
{
  extern Class_Descriptor cd_G13x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G13x7y5, buf);
    G13x7y5 *dp, &lv = *(dp=new (buf) G13x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G13x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y5)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,20), "G13x7y5");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,32), "G13x7y5");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(32,20), "G13x7y5");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(60,40), "G13x7y5");
    check_base_class_offset(lv, (E13x7*), ABISELECT(16,12), "G13x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G13x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x7y5.ff");
    test_class_info(&lv, &cd_G13x7y5);
    dp->~G13x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y5(Test_G13x7y5, "G13x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G13x7y5C1Ev();
extern void _ZN7G13x7y5D1Ev();
Name_Map name_map_G13x7y5[] = {
  NSPAIR(_ZN7G13x7y5C1Ev),
  NSPAIR(_ZN7G13x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G13x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G13x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y5[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y5[] = {
  {&(_ZTV7G13x7y5[6]),  6,20},
  {&(_ZTV7G13x7y5[11]),  11,20},
  {&(_ZTV7G13x7y5[15]),  15,20},
  {&(_ZTV7G13x7y5[19]),  19,20},
  {&(_tg__ZTV5E13x7__7G13x7y5[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y5[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y5[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y5[];
extern  VTBL_ENTRY _ZTV7G13x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y5[];
Class_Descriptor cd_G13x7y5 = {  "G13x7y5", // class name
  bases_G13x7y5, 6,
  &(vtc_G13x7y5[0]), // expected_vtbl_contents
  &(vtt_G13x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G13x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y6  : E13x7 , virtual F0 {
  int ff;
  ~G13x7y6(); // tgen
  G13x7y6(); // tgen
};
//SIG(1 G13x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x7y6 ::~G13x7y6(){ note_dtor("G13x7y6", this);} // tgen
G13x7y6 ::G13x7y6(){ note_ctor("G13x7y6", this);} // tgen

static void Test_G13x7y6()
{
  extern Class_Descriptor cd_G13x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G13x7y6, buf);
    G13x7y6 *dp, &lv = *(dp=new (buf) G13x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G13x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y6)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(16,12), "G13x7y6");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(32,24), "G13x7y6");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(16,12), "G13x7y6");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(44,32), "G13x7y6");
    check_base_class_offset(lv, (E13x7*), 0, "G13x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G13x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G13x7y6.ff");
    test_class_info(&lv, &cd_G13x7y6);
    dp->~G13x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y6(Test_G13x7y6, "G13x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G13x7y6C1Ev();
extern void _ZN7G13x7y6D1Ev();
Name_Map name_map_G13x7y6[] = {
  NSPAIR(_ZN7G13x7y6C1Ev),
  NSPAIR(_ZN7G13x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G13x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G13x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y6[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y6[] = {
  {&(_ZTV7G13x7y6[6]),  6,15},
  {&(_tg__ZTV5E13x7__7G13x7y6[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y6[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y6[3]),  3,4},
  {&(_ZTV7G13x7y6[10]),  10,15},
  {&(_ZTV7G13x7y6[14]),  14,15},
  {&(_tg__ZTV3C13__7G13x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y6[];
extern  VTBL_ENTRY _ZTV7G13x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y6[];
Class_Descriptor cd_G13x7y6 = {  "G13x7y6", // class name
  bases_G13x7y6, 6,
  &(vtc_G13x7y6[0]), // expected_vtbl_contents
  &(vtt_G13x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G13x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G13x7y7  : virtual E13x7 , virtual F0 {
  int ff;
  ~G13x7y7(); // tgen
  G13x7y7(); // tgen
};
//SIG(1 G13x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G13x7y7 ::~G13x7y7(){ note_dtor("G13x7y7", this);} // tgen
G13x7y7 ::G13x7y7(){ note_ctor("G13x7y7", this);} // tgen

static void Test_G13x7y7()
{
  extern Class_Descriptor cd_G13x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G13x7y7, buf);
    G13x7y7 *dp, &lv = *(dp=new (buf) G13x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G13x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G13x7y7)");
    check_base_class_offset(lv, (A1*)(C13*), ABISELECT(32,16), "G13x7y7");
    check_base_class_offset(lv, (B1*)(C13*), ABISELECT(48,28), "G13x7y7");
    check_base_class_offset(lv, (C13*)(E13x7*), ABISELECT(32,16), "G13x7y7");
    check_base_class_offset(lv, (D0*)(E13x7*), ABISELECT(60,36), "G13x7y7");
    check_base_class_offset(lv, (E13x7*), ABISELECT(16,8), "G13x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G13x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G13x7y7.ff");
    test_class_info(&lv, &cd_G13x7y7);
    dp->~G13x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG13x7y7(Test_G13x7y7, "G13x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G13x7y7C1Ev();
extern void _ZN7G13x7y7D1Ev();
Name_Map name_map_G13x7y7[] = {
  NSPAIR(_ZN7G13x7y7C1Ev),
  NSPAIR(_ZN7G13x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C13;
extern VTBL_ENTRY _ZTI3C13[];
extern  VTBL_ENTRY _ZTV3C13[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C13[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E13x7;
extern VTBL_ENTRY _ZTI5E13x7[];
extern  VTBL_ENTRY _ZTV5E13x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E13x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G13x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C13,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E13x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G13x7y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G13x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G13x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G13x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G13x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G13x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G13x7y7[];
static  VTBL_ENTRY _tg__ZTV5E13x7__7G13x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__5E13x7__7G13x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E13x7__7G13x7y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E13x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV3C13__7G13x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C13__7G13x7y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C13[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G13x7y7[] = {
  {&(_ZTV7G13x7y7[7]),  7,21},
  {&(_ZTV7G13x7y7[12]),  12,21},
  {&(_ZTV7G13x7y7[16]),  16,21},
  {&(_ZTV7G13x7y7[20]),  20,21},
  {&(_tg__ZTV5E13x7__7G13x7y7[5]),  5,5},
  {&(_tg__ZTV3C13__5E13x7__7G13x7y7[4]),  4,5},
  {&(_tg__ZTV2B1__5E13x7__7G13x7y7[3]),  3,4},
  {&(_tg__ZTV3C13__7G13x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C13__7G13x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G13x7y7[];
extern  VTBL_ENTRY _ZTV7G13x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G13x7y7[];
Class_Descriptor cd_G13x7y7 = {  "G13x7y7", // class name
  bases_G13x7y7, 6,
  &(vtc_G13x7y7[0]), // expected_vtbl_contents
  &(vtt_G13x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G13x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G13x7y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G13x7y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E14x7  : virtual C14 , virtual D0 {
  int fd;
  ~E14x7(); // tgen
  E14x7(); // tgen
};
//SIG(-1 E14x7) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} Fi} VBC5{ Fi} Fi}


E14x7 ::~E14x7(){ note_dtor("E14x7", this);} // tgen
E14x7 ::E14x7(){ note_ctor("E14x7", this);} // tgen

static void Test_E14x7()
{
  extern Class_Descriptor cd_E14x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E14x7, buf);
    E14x7 *dp, &lv = *(dp=new (buf) E14x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E14x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E14x7)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,16), "E14x7");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,20), "E14x7");
    check_base_class_offset(lv, (C14*), ABISELECT(16,8), "E14x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E14x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E14x7.fd");
    test_class_info(&lv, &cd_E14x7);
    dp->~E14x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE14x7(Test_E14x7, "E14x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E14x7C1Ev();
extern void _ZN5E14x7D1Ev();
Name_Map name_map_E14x7[] = {
  NSPAIR(_ZN5E14x7C1Ev),
  NSPAIR(_ZN5E14x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E14x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E14x7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E14x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E14x7[];
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__5E14x7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E14x7[] = {
  {&(_ZTV5E14x7[6]),  6,14},
  {&(_ZTV5E14x7[10]),  10,14},
  {&(_ZTV5E14x7[13]),  13,14},
  {&(_tg__ZTV3C14__5E14x7[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__5E14x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
Class_Descriptor cd_E14x7 = {  "E14x7", // class name
  bases_E14x7, 4,
  &(vtc_E14x7[0]), // expected_vtbl_contents
  &(vtt_E14x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E14x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E14x7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E14x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y0  : E14x7 , F1 {
  int ff;
  ~G14x7y0(); // tgen
  G14x7y0(); // tgen
};
//SIG(1 G14x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x7y0 ::~G14x7y0(){ note_dtor("G14x7y0", this);} // tgen
G14x7y0 ::G14x7y0(){ note_ctor("G14x7y0", this);} // tgen

static void Test_G14x7y0()
{
  extern Class_Descriptor cd_G14x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x7y0, buf);
    G14x7y0 *dp, &lv = *(dp=new (buf) G14x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y0)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x7y0");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x7y0");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(32,20), "G14x7y0");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(60,40), "G14x7y0");
    check_base_class_offset(lv, (E14x7*), 0, "G14x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G14x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G14x7y0.ff");
    test_class_info(&lv, &cd_G14x7y0);
    dp->~G14x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y0(Test_G14x7y0, "G14x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x7y0C1Ev();
extern void _ZN7G14x7y0D1Ev();
Name_Map name_map_G14x7y0[] = {
  NSPAIR(_ZN7G14x7y0C1Ev),
  NSPAIR(_ZN7G14x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G14x7y0[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y0[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y0[] = {
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y0[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y0[] = {
  {&(_ZTV7G14x7y0[6]),  6,17},
  {&(_tg__ZTV5E14x7__7G14x7y0[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y0[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y0[3]),  3,4},
  {&(_ZTV7G14x7y0[13]),  13,17},
  {&(_ZTV7G14x7y0[16]),  16,17},
  {&(_tg__ZTV3C14__7G14x7y0[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y0[];
extern  VTBL_ENTRY _ZTV7G14x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y0[];
Class_Descriptor cd_G14x7y0 = {  "G14x7y0", // class name
  bases_G14x7y0, 6,
  &(vtc_G14x7y0[0]), // expected_vtbl_contents
  &(vtt_G14x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y0),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y1  : virtual E14x7 , F1 {
  int ff;
  ~G14x7y1(); // tgen
  G14x7y1(); // tgen
};
//SIG(1 G14x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G14x7y1 ::~G14x7y1(){ note_dtor("G14x7y1", this);} // tgen
G14x7y1 ::G14x7y1(){ note_ctor("G14x7y1", this);} // tgen

static void Test_G14x7y1()
{
  extern Class_Descriptor cd_G14x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x7y1, buf);
    G14x7y1 *dp, &lv = *(dp=new (buf) G14x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y1)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x7y1");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x7y1");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(32,20), "G14x7y1");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(60,40), "G14x7y1");
    check_base_class_offset(lv, (E14x7*), ABISELECT(16,12), "G14x7y1");
    check_base_class_offset(lv, (F1*), 0, "G14x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x7y1.ff");
    test_class_info(&lv, &cd_G14x7y1);
    dp->~G14x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y1(Test_G14x7y1, "G14x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x7y1C1Ev();
extern void _ZN7G14x7y1D1Ev();
Name_Map name_map_G14x7y1[] = {
  NSPAIR(_ZN7G14x7y1C1Ev),
  NSPAIR(_ZN7G14x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x7y1[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G14x7y1[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y1[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y1[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y1[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y1[] = {
  {&(_ZTV7G14x7y1[7]),  7,22},
  {&(_ZTV7G14x7y1[14]),  14,22},
  {&(_ZTV7G14x7y1[18]),  18,22},
  {&(_ZTV7G14x7y1[21]),  21,22},
  {&(_tg__ZTV5E14x7__7G14x7y1[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y1[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y1[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x7y1[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y1[];
extern  VTBL_ENTRY _ZTV7G14x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y1[];
Class_Descriptor cd_G14x7y1 = {  "G14x7y1", // class name
  bases_G14x7y1, 6,
  &(vtc_G14x7y1[0]), // expected_vtbl_contents
  &(vtt_G14x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y1),22, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y2  : E14x7 , virtual F1 {
  int ff;
  ~G14x7y2(); // tgen
  G14x7y2(); // tgen
};
//SIG(1 G14x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x7y2 ::~G14x7y2(){ note_dtor("G14x7y2", this);} // tgen
G14x7y2 ::G14x7y2(){ note_ctor("G14x7y2", this);} // tgen

static void Test_G14x7y2()
{
  extern Class_Descriptor cd_G14x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x7y2, buf);
    G14x7y2 *dp, &lv = *(dp=new (buf) G14x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y2)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,20), "G14x7y2");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,24), "G14x7y2");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(16,12), "G14x7y2");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(44,32), "G14x7y2");
    check_base_class_offset(lv, (E14x7*), 0, "G14x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G14x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x7y2.ff");
    test_class_info(&lv, &cd_G14x7y2);
    dp->~G14x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y2(Test_G14x7y2, "G14x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x7y2C1Ev();
extern void _ZN7G14x7y2D1Ev();
Name_Map name_map_G14x7y2[] = {
  NSPAIR(_ZN7G14x7y2C1Ev),
  NSPAIR(_ZN7G14x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y2[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y2[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x7y2[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G14x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y2[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y2[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y2[] = {
  {&(_ZTV7G14x7y2[7]),  7,19},
  {&(_tg__ZTV5E14x7__7G14x7y2[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y2[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y2[3]),  3,4},
  {&(_ZTV7G14x7y2[11]),  11,19},
  {&(_ZTV7G14x7y2[14]),  14,19},
  {&(_ZTV7G14x7y2[18]),  18,19},
  {&(_tg__ZTV3C14__7G14x7y2[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y2[];
extern  VTBL_ENTRY _ZTV7G14x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y2[];
Class_Descriptor cd_G14x7y2 = {  "G14x7y2", // class name
  bases_G14x7y2, 6,
  &(vtc_G14x7y2[0]), // expected_vtbl_contents
  &(vtt_G14x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y2),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y3  : virtual E14x7 , virtual F1 {
  int ff;
  ~G14x7y3(); // tgen
  G14x7y3(); // tgen
};
//SIG(1 G14x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G14x7y3 ::~G14x7y3(){ note_dtor("G14x7y3", this);} // tgen
G14x7y3 ::G14x7y3(){ note_ctor("G14x7y3", this);} // tgen

static void Test_G14x7y3()
{
  extern Class_Descriptor cd_G14x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G14x7y3, buf);
    G14x7y3 *dp, &lv = *(dp=new (buf) G14x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G14x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y3)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,24), "G14x7y3");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,28), "G14x7y3");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(32,16), "G14x7y3");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(60,36), "G14x7y3");
    check_base_class_offset(lv, (E14x7*), ABISELECT(16,8), "G14x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G14x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x7y3.ff");
    test_class_info(&lv, &cd_G14x7y3);
    dp->~G14x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y3(Test_G14x7y3, "G14x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G14x7y3C1Ev();
extern void _ZN7G14x7y3D1Ev();
Name_Map name_map_G14x7y3[] = {
  NSPAIR(_ZN7G14x7y3C1Ev),
  NSPAIR(_ZN7G14x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G14x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y3[];
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G14x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x7y3[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G14x7y3[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G14x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G14x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y3[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y3[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y3[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y3[] = {
  {&(_ZTV7G14x7y3[8]),  8,26},
  {&(_ZTV7G14x7y3[14]),  14,26},
  {&(_ZTV7G14x7y3[18]),  18,26},
  {&(_ZTV7G14x7y3[21]),  21,26},
  {&(_ZTV7G14x7y3[25]),  25,26},
  {&(_tg__ZTV5E14x7__7G14x7y3[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y3[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y3[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x7y3[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y3[];
extern  VTBL_ENTRY _ZTV7G14x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y3[];
Class_Descriptor cd_G14x7y3 = {  "G14x7y3", // class name
  bases_G14x7y3, 6,
  &(vtc_G14x7y3[0]), // expected_vtbl_contents
  &(vtt_G14x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G14x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y3),26, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y4  : E14x7 , F0 {
  int ff;
  ~G14x7y4(); // tgen
  G14x7y4(); // tgen
};
//SIG(1 G14x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G14x7y4 ::~G14x7y4(){ note_dtor("G14x7y4", this);} // tgen
G14x7y4 ::G14x7y4(){ note_ctor("G14x7y4", this);} // tgen

static void Test_G14x7y4()
{
  extern Class_Descriptor cd_G14x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x7y4, buf);
    G14x7y4 *dp, &lv = *(dp=new (buf) G14x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y4)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(36,24), "G14x7y4");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(40,28), "G14x7y4");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(24,16), "G14x7y4");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(52,36), "G14x7y4");
    check_base_class_offset(lv, (E14x7*), 0, "G14x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G14x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G14x7y4.ff");
    test_class_info(&lv, &cd_G14x7y4);
    dp->~G14x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y4(Test_G14x7y4, "G14x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x7y4C1Ev();
extern void _ZN7G14x7y4D1Ev();
Name_Map name_map_G14x7y4[] = {
  NSPAIR(_ZN7G14x7y4C1Ev),
  NSPAIR(_ZN7G14x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y4[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y4[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G14x7y4[0]),
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G14x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y4[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y4[] = {
  0,
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y4[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y4[] = {
  {&(_ZTV7G14x7y4[6]),  6,14},
  {&(_tg__ZTV5E14x7__7G14x7y4[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y4[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y4[3]),  3,4},
  {&(_ZTV7G14x7y4[10]),  10,14},
  {&(_ZTV7G14x7y4[13]),  13,14},
  {&(_tg__ZTV3C14__7G14x7y4[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y4[];
extern  VTBL_ENTRY _ZTV7G14x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y4[];
Class_Descriptor cd_G14x7y4 = {  "G14x7y4", // class name
  bases_G14x7y4, 6,
  &(vtc_G14x7y4[0]), // expected_vtbl_contents
  &(vtt_G14x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y4),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y5  : virtual E14x7 , F0 {
  int ff;
  ~G14x7y5(); // tgen
  G14x7y5(); // tgen
};
//SIG(1 G14x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G14x7y5 ::~G14x7y5(){ note_dtor("G14x7y5", this);} // tgen
G14x7y5 ::G14x7y5(){ note_ctor("G14x7y5", this);} // tgen

static void Test_G14x7y5()
{
  extern Class_Descriptor cd_G14x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G14x7y5, buf);
    G14x7y5 *dp, &lv = *(dp=new (buf) G14x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G14x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y5)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,28), "G14x7y5");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,32), "G14x7y5");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(32,20), "G14x7y5");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(60,40), "G14x7y5");
    check_base_class_offset(lv, (E14x7*), ABISELECT(16,12), "G14x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G14x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x7y5.ff");
    test_class_info(&lv, &cd_G14x7y5);
    dp->~G14x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y5(Test_G14x7y5, "G14x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G14x7y5C1Ev();
extern void _ZN7G14x7y5D1Ev();
Name_Map name_map_G14x7y5[] = {
  NSPAIR(_ZN7G14x7y5C1Ev),
  NSPAIR(_ZN7G14x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y5[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x7y5[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G14x7y5[0]),
  0,
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G14x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y5[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y5[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y5[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y5[] = {
  {&(_ZTV7G14x7y5[7]),  7,21},
  {&(_ZTV7G14x7y5[13]),  13,21},
  {&(_ZTV7G14x7y5[17]),  17,21},
  {&(_ZTV7G14x7y5[20]),  20,21},
  {&(_tg__ZTV5E14x7__7G14x7y5[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y5[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y5[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x7y5[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y5[];
extern  VTBL_ENTRY _ZTV7G14x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y5[];
Class_Descriptor cd_G14x7y5 = {  "G14x7y5", // class name
  bases_G14x7y5, 6,
  &(vtc_G14x7y5[0]), // expected_vtbl_contents
  &(vtt_G14x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G14x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y5),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y6  : E14x7 , virtual F0 {
  int ff;
  ~G14x7y6(); // tgen
  G14x7y6(); // tgen
};
//SIG(1 G14x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x7y6 ::~G14x7y6(){ note_dtor("G14x7y6", this);} // tgen
G14x7y6 ::G14x7y6(){ note_ctor("G14x7y6", this);} // tgen

static void Test_G14x7y6()
{
  extern Class_Descriptor cd_G14x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G14x7y6, buf);
    G14x7y6 *dp, &lv = *(dp=new (buf) G14x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G14x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y6)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(28,20), "G14x7y6");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(32,24), "G14x7y6");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(16,12), "G14x7y6");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(44,32), "G14x7y6");
    check_base_class_offset(lv, (E14x7*), 0, "G14x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G14x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G14x7y6.ff");
    test_class_info(&lv, &cd_G14x7y6);
    dp->~G14x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y6(Test_G14x7y6, "G14x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G14x7y6C1Ev();
extern void _ZN7G14x7y6D1Ev();
Name_Map name_map_G14x7y6[] = {
  NSPAIR(_ZN7G14x7y6C1Ev),
  NSPAIR(_ZN7G14x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y6[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y6[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G14x7y6[0]),
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G14x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y6[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y6[] = {
  0,
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y6[] = {
  {&(_ZTV7G14x7y6[7]),  7,15},
  {&(_tg__ZTV5E14x7__7G14x7y6[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y6[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y6[3]),  3,4},
  {&(_ZTV7G14x7y6[11]),  11,15},
  {&(_ZTV7G14x7y6[14]),  14,15},
  {&(_tg__ZTV3C14__7G14x7y6[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y6[];
extern  VTBL_ENTRY _ZTV7G14x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y6[];
Class_Descriptor cd_G14x7y6 = {  "G14x7y6", // class name
  bases_G14x7y6, 6,
  &(vtc_G14x7y6[0]), // expected_vtbl_contents
  &(vtt_G14x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G14x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y6),15, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G14x7y7  : virtual E14x7 , virtual F0 {
  int ff;
  ~G14x7y7(); // tgen
  G14x7y7(); // tgen
};
//SIG(1 G14x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G14x7y7 ::~G14x7y7(){ note_dtor("G14x7y7", this);} // tgen
G14x7y7 ::G14x7y7(){ note_ctor("G14x7y7", this);} // tgen

static void Test_G14x7y7()
{
  extern Class_Descriptor cd_G14x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G14x7y7, buf);
    G14x7y7 *dp, &lv = *(dp=new (buf) G14x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G14x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G14x7y7)");
    check_base_class_offset(lv, (A0*)(C14*), ABISELECT(44,24), "G14x7y7");
    check_base_class_offset(lv, (B1*)(C14*), ABISELECT(48,28), "G14x7y7");
    check_base_class_offset(lv, (C14*)(E14x7*), ABISELECT(32,16), "G14x7y7");
    check_base_class_offset(lv, (D0*)(E14x7*), ABISELECT(60,36), "G14x7y7");
    check_base_class_offset(lv, (E14x7*), ABISELECT(16,8), "G14x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G14x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G14x7y7.ff");
    test_class_info(&lv, &cd_G14x7y7);
    dp->~G14x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG14x7y7(Test_G14x7y7, "G14x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G14x7y7C1Ev();
extern void _ZN7G14x7y7D1Ev();
Name_Map name_map_G14x7y7[] = {
  NSPAIR(_ZN7G14x7y7C1Ev),
  NSPAIR(_ZN7G14x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C14;
extern VTBL_ENTRY _ZTI3C14[];
extern  VTBL_ENTRY _ZTV3C14[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C14[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E14x7;
extern VTBL_ENTRY _ZTI5E14x7[];
extern  VTBL_ENTRY _ZTV5E14x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E14x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G14x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C14,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E14x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G14x7y7[];
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G14x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G14x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G14x7y7[0]),
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G14x7y7[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G14x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G14x7y7[];
static  VTBL_ENTRY _tg__ZTV5E14x7__7G14x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C14__5E14x7__7G14x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E14x7__7G14x7y7[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E14x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C14__7G14x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C14[0]),
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C14__7G14x7y7[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C14[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G14x7y7[] = {
  {&(_ZTV7G14x7y7[8]),  8,22},
  {&(_ZTV7G14x7y7[14]),  14,22},
  {&(_ZTV7G14x7y7[18]),  18,22},
  {&(_ZTV7G14x7y7[21]),  21,22},
  {&(_tg__ZTV5E14x7__7G14x7y7[6]),  6,6},
  {&(_tg__ZTV3C14__5E14x7__7G14x7y7[4]),  4,4},
  {&(_tg__ZTV2B1__5E14x7__7G14x7y7[3]),  3,4},
  {&(_tg__ZTV3C14__7G14x7y7[4]),  4,4},
  {&(_tg__ZTV2B1__3C14__7G14x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G14x7y7[];
extern  VTBL_ENTRY _ZTV7G14x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G14x7y7[];
Class_Descriptor cd_G14x7y7 = {  "G14x7y7", // class name
  bases_G14x7y7, 6,
  &(vtc_G14x7y7[0]), // expected_vtbl_contents
  &(vtt_G14x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G14x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G14x7y7),22, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G14x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E15x7  : virtual C15 , virtual D0 {
  int fd;
  ~E15x7(); // tgen
  E15x7(); // tgen
};
//SIG(-1 E15x7) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v2 Fi} Fi} VBC5{ Fi} Fi}


E15x7 ::~E15x7(){ note_dtor("E15x7", this);} // tgen
E15x7 ::E15x7(){ note_ctor("E15x7", this);} // tgen

static void Test_E15x7()
{
  extern Class_Descriptor cd_E15x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E15x7, buf);
    E15x7 *dp, &lv = *(dp=new (buf) E15x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E15x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E15x7)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,16), "E15x7");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,24), "E15x7");
    check_base_class_offset(lv, (C15*), ABISELECT(16,8), "E15x7");
    check_base_class_offset(lv, (D0*), ABISELECT(60,32), "E15x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E15x7.fd");
    test_class_info(&lv, &cd_E15x7);
    dp->~E15x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE15x7(Test_E15x7, "E15x7", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN5E15x7C1Ev();
extern void _ZN5E15x7D1Ev();
Name_Map name_map_E15x7[] = {
  NSPAIR(_ZN5E15x7C1Ev),
  NSPAIR(_ZN5E15x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E15x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(60,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E15x7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_E15x7[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV5E15x7[];
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__5E15x7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__5E15x7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_E15x7[] = {
  {&(_ZTV5E15x7[6]),  6,18},
  {&(_ZTV5E15x7[10]),  10,18},
  {&(_ZTV5E15x7[13]),  13,18},
  {&(_ZTV5E15x7[17]),  17,18},
  {&(_tg__ZTV3C15__5E15x7[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__5E15x7[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__5E15x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
Class_Descriptor cd_E15x7 = {  "E15x7", // class name
  bases_E15x7, 4,
  &(vtc_E15x7[0]), // expected_vtbl_contents
  &(vtt_E15x7[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI5E15x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E15x7),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E15x7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y0  : E15x7 , F1 {
  int ff;
  ~G15x7y0(); // tgen
  G15x7y0(); // tgen
};
//SIG(1 G15x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x7y0 ::~G15x7y0(){ note_dtor("G15x7y0", this);} // tgen
G15x7y0 ::G15x7y0(){ note_ctor("G15x7y0", this);} // tgen

static void Test_G15x7y0()
{
  extern Class_Descriptor cd_G15x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x7y0, buf);
    G15x7y0 *dp, &lv = *(dp=new (buf) G15x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y0)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x7y0");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x7y0");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(32,20), "G15x7y0");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(76,44), "G15x7y0");
    check_base_class_offset(lv, (E15x7*), 0, "G15x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G15x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G15x7y0.ff");
    test_class_info(&lv, &cd_G15x7y0);
    dp->~G15x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y0(Test_G15x7y0, "G15x7y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x7y0C1Ev();
extern void _ZN7G15x7y0D1Ev();
Name_Map name_map_G15x7y0[] = {
  NSPAIR(_ZN7G15x7y0C1Ev),
  NSPAIR(_ZN7G15x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x7y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x7y0[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x7y0[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G15x7y0[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y0[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y0[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y0[] = {
  0,
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y0[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y0[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y0[] = {
  {&(_ZTV7G15x7y0[6]),  6,21},
  {&(_tg__ZTV5E15x7__7G15x7y0[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y0[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y0[3]),  3,4},
  {&(_ZTV7G15x7y0[13]),  13,21},
  {&(_ZTV7G15x7y0[16]),  16,21},
  {&(_ZTV7G15x7y0[20]),  20,21},
  {&(_tg__ZTV3C15__7G15x7y0[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y0[];
extern  VTBL_ENTRY _ZTV7G15x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y0[];
Class_Descriptor cd_G15x7y0 = {  "G15x7y0", // class name
  bases_G15x7y0, 6,
  &(vtc_G15x7y0[0]), // expected_vtbl_contents
  &(vtt_G15x7y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y0),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y1  : virtual E15x7 , F1 {
  int ff;
  ~G15x7y1(); // tgen
  G15x7y1(); // tgen
};
//SIG(1 G15x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ v3 Fi} Fi}


G15x7y1 ::~G15x7y1(){ note_dtor("G15x7y1", this);} // tgen
G15x7y1 ::G15x7y1(){ note_ctor("G15x7y1", this);} // tgen

static void Test_G15x7y1()
{
  extern Class_Descriptor cd_G15x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x7y1, buf);
    G15x7y1 *dp, &lv = *(dp=new (buf) G15x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y1)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x7y1");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x7y1");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(32,20), "G15x7y1");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(76,44), "G15x7y1");
    check_base_class_offset(lv, (E15x7*), ABISELECT(16,12), "G15x7y1");
    check_base_class_offset(lv, (F1*), 0, "G15x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x7y1.ff");
    test_class_info(&lv, &cd_G15x7y1);
    dp->~G15x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y1(Test_G15x7y1, "G15x7y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x7y1C1Ev();
extern void _ZN7G15x7y1D1Ev();
Name_Map name_map_G15x7y1[] = {
  NSPAIR(_ZN7G15x7y1C1Ev),
  NSPAIR(_ZN7G15x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x7y1[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x7y1[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x7y1[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x7y1[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G15x7y1[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y1[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y1[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y1[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y1[] = {
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y1[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y1[] = {
  {&(_ZTV7G15x7y1[7]),  7,26},
  {&(_ZTV7G15x7y1[14]),  14,26},
  {&(_ZTV7G15x7y1[18]),  18,26},
  {&(_ZTV7G15x7y1[21]),  21,26},
  {&(_ZTV7G15x7y1[25]),  25,26},
  {&(_tg__ZTV5E15x7__7G15x7y1[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y1[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y1[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x7y1[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y1[];
extern  VTBL_ENTRY _ZTV7G15x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y1[];
Class_Descriptor cd_G15x7y1 = {  "G15x7y1", // class name
  bases_G15x7y1, 6,
  &(vtc_G15x7y1[0]), // expected_vtbl_contents
  &(vtt_G15x7y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y1),26, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y2  : E15x7 , virtual F1 {
  int ff;
  ~G15x7y2(); // tgen
  G15x7y2(); // tgen
};
//SIG(1 G15x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x7y2 ::~G15x7y2(){ note_dtor("G15x7y2", this);} // tgen
G15x7y2 ::G15x7y2(){ note_ctor("G15x7y2", this);} // tgen

static void Test_G15x7y2()
{
  extern Class_Descriptor cd_G15x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x7y2, buf);
    G15x7y2 *dp, &lv = *(dp=new (buf) G15x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y2)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,20), "G15x7y2");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,28), "G15x7y2");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(16,12), "G15x7y2");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(60,36), "G15x7y2");
    check_base_class_offset(lv, (E15x7*), 0, "G15x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G15x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x7y2.ff");
    test_class_info(&lv, &cd_G15x7y2);
    dp->~G15x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y2(Test_G15x7y2, "G15x7y2", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x7y2C1Ev();
extern void _ZN7G15x7y2D1Ev();
Name_Map name_map_G15x7y2[] = {
  NSPAIR(_ZN7G15x7y2C1Ev),
  NSPAIR(_ZN7G15x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y2[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x7y2[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y2[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x7y2[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x7y2[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x7y2[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G15x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y2[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y2[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y2[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y2[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y2[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y2[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y2[] = {
  {&(_ZTV7G15x7y2[7]),  7,23},
  {&(_tg__ZTV5E15x7__7G15x7y2[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y2[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y2[3]),  3,4},
  {&(_ZTV7G15x7y2[11]),  11,23},
  {&(_ZTV7G15x7y2[14]),  14,23},
  {&(_ZTV7G15x7y2[18]),  18,23},
  {&(_ZTV7G15x7y2[22]),  22,23},
  {&(_tg__ZTV3C15__7G15x7y2[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y2[];
extern  VTBL_ENTRY _ZTV7G15x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y2[];
Class_Descriptor cd_G15x7y2 = {  "G15x7y2", // class name
  bases_G15x7y2, 6,
  &(vtc_G15x7y2[0]), // expected_vtbl_contents
  &(vtt_G15x7y2[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y2),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y3  : virtual E15x7 , virtual F1 {
  int ff;
  ~G15x7y3(); // tgen
  G15x7y3(); // tgen
};
//SIG(1 G15x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ v3 Fi} Fi}


G15x7y3 ::~G15x7y3(){ note_dtor("G15x7y3", this);} // tgen
G15x7y3 ::G15x7y3(){ note_ctor("G15x7y3", this);} // tgen

static void Test_G15x7y3()
{
  extern Class_Descriptor cd_G15x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G15x7y3, buf);
    G15x7y3 *dp, &lv = *(dp=new (buf) G15x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G15x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y3)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,24), "G15x7y3");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,32), "G15x7y3");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(32,16), "G15x7y3");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(76,40), "G15x7y3");
    check_base_class_offset(lv, (E15x7*), ABISELECT(16,8), "G15x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G15x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x7y3.ff");
    test_class_info(&lv, &cd_G15x7y3);
    dp->~G15x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y3(Test_G15x7y3, "G15x7y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN7G15x7y3C1Ev();
extern void _ZN7G15x7y3D1Ev();
Name_Map name_map_G15x7y3[] = {
  NSPAIR(_ZN7G15x7y3C1Ev),
  NSPAIR(_ZN7G15x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G15x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,32), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    11, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(80,44), //bcp->offset
    26, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y3[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G15x7y3[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y3[0]),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x7y3[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G15x7y3[0]),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G15x7y3[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI7G15x7y3[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI7G15x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y3[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y3[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y3[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y3[] = {
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y3[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y3[] = {
  {&(_ZTV7G15x7y3[8]),  8,30},
  {&(_ZTV7G15x7y3[14]),  14,30},
  {&(_ZTV7G15x7y3[18]),  18,30},
  {&(_ZTV7G15x7y3[21]),  21,30},
  {&(_ZTV7G15x7y3[25]),  25,30},
  {&(_ZTV7G15x7y3[29]),  29,30},
  {&(_tg__ZTV5E15x7__7G15x7y3[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y3[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y3[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x7y3[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y3[];
extern  VTBL_ENTRY _ZTV7G15x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y3[];
Class_Descriptor cd_G15x7y3 = {  "G15x7y3", // class name
  bases_G15x7y3, 6,
  &(vtc_G15x7y3[0]), // expected_vtbl_contents
  &(vtt_G15x7y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI7G15x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y3),30, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y4  : E15x7 , F0 {
  int ff;
  ~G15x7y4(); // tgen
  G15x7y4(); // tgen
};
//SIG(1 G15x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G15x7y4 ::~G15x7y4(){ note_dtor("G15x7y4", this);} // tgen
G15x7y4 ::G15x7y4(){ note_ctor("G15x7y4", this);} // tgen

static void Test_G15x7y4()
{
  extern Class_Descriptor cd_G15x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x7y4, buf);
    G15x7y4 *dp, &lv = *(dp=new (buf) G15x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y4)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(40,24), "G15x7y4");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(56,32), "G15x7y4");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(24,16), "G15x7y4");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(68,40), "G15x7y4");
    check_base_class_offset(lv, (E15x7*), 0, "G15x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G15x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G15x7y4.ff");
    test_class_info(&lv, &cd_G15x7y4);
    dp->~G15x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y4(Test_G15x7y4, "G15x7y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x7y4C1Ev();
extern void _ZN7G15x7y4D1Ev();
Name_Map name_map_G15x7y4[] = {
  NSPAIR(_ZN7G15x7y4C1Ev),
  NSPAIR(_ZN7G15x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y4[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x7y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y4[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G15x7y4[0]),
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G15x7y4[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G15x7y4[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y4[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y4[] = {
  0,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y4[] = {
  0,
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y4[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y4[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y4[] = {
  {&(_ZTV7G15x7y4[6]),  6,18},
  {&(_tg__ZTV5E15x7__7G15x7y4[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y4[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y4[3]),  3,4},
  {&(_ZTV7G15x7y4[10]),  10,18},
  {&(_ZTV7G15x7y4[13]),  13,18},
  {&(_ZTV7G15x7y4[17]),  17,18},
  {&(_tg__ZTV3C15__7G15x7y4[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y4[];
extern  VTBL_ENTRY _ZTV7G15x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y4[];
Class_Descriptor cd_G15x7y4 = {  "G15x7y4", // class name
  bases_G15x7y4, 6,
  &(vtc_G15x7y4[0]), // expected_vtbl_contents
  &(vtt_G15x7y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y4),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y5  : virtual E15x7 , F0 {
  int ff;
  ~G15x7y5(); // tgen
  G15x7y5(); // tgen
};
//SIG(1 G15x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G15x7y5 ::~G15x7y5(){ note_dtor("G15x7y5", this);} // tgen
G15x7y5 ::G15x7y5(){ note_ctor("G15x7y5", this);} // tgen

static void Test_G15x7y5()
{
  extern Class_Descriptor cd_G15x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G15x7y5, buf);
    G15x7y5 *dp, &lv = *(dp=new (buf) G15x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G15x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y5)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,28), "G15x7y5");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,36), "G15x7y5");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(32,20), "G15x7y5");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(76,44), "G15x7y5");
    check_base_class_offset(lv, (E15x7*), ABISELECT(16,12), "G15x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G15x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x7y5.ff");
    test_class_info(&lv, &cd_G15x7y5);
    dp->~G15x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y5(Test_G15x7y5, "G15x7y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G15x7y5C1Ev();
extern void _ZN7G15x7y5D1Ev();
Name_Map name_map_G15x7y5[] = {
  NSPAIR(_ZN7G15x7y5C1Ev),
  NSPAIR(_ZN7G15x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y5[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x7y5[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y5[0]),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x7y5[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x7y5[0]),
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x7y5[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G15x7y5[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y5[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y5[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y5[] = {
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y5[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y5[] = {
  {&(_ZTV7G15x7y5[7]),  7,25},
  {&(_ZTV7G15x7y5[13]),  13,25},
  {&(_ZTV7G15x7y5[17]),  17,25},
  {&(_ZTV7G15x7y5[20]),  20,25},
  {&(_ZTV7G15x7y5[24]),  24,25},
  {&(_tg__ZTV5E15x7__7G15x7y5[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y5[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y5[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x7y5[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y5[];
extern  VTBL_ENTRY _ZTV7G15x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y5[];
Class_Descriptor cd_G15x7y5 = {  "G15x7y5", // class name
  bases_G15x7y5, 6,
  &(vtc_G15x7y5[0]), // expected_vtbl_contents
  &(vtt_G15x7y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G15x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y5),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y6  : E15x7 , virtual F0 {
  int ff;
  ~G15x7y6(); // tgen
  G15x7y6(); // tgen
};
//SIG(1 G15x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x7y6 ::~G15x7y6(){ note_dtor("G15x7y6", this);} // tgen
G15x7y6 ::G15x7y6(){ note_ctor("G15x7y6", this);} // tgen

static void Test_G15x7y6()
{
  extern Class_Descriptor cd_G15x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G15x7y6, buf);
    G15x7y6 *dp, &lv = *(dp=new (buf) G15x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G15x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y6)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(32,20), "G15x7y6");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(48,28), "G15x7y6");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(16,12), "G15x7y6");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(60,36), "G15x7y6");
    check_base_class_offset(lv, (E15x7*), 0, "G15x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G15x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G15x7y6.ff");
    test_class_info(&lv, &cd_G15x7y6);
    dp->~G15x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y6(Test_G15x7y6, "G15x7y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G15x7y6C1Ev();
extern void _ZN7G15x7y6D1Ev();
Name_Map name_map_G15x7y6[] = {
  NSPAIR(_ZN7G15x7y6C1Ev),
  NSPAIR(_ZN7G15x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y6[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x7y6[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y6[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G15x7y6[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G15x7y6[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G15x7y6[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y6[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y6[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y6[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y6[] = {
  0,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y6[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y6[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y6[] = {
  {&(_ZTV7G15x7y6[7]),  7,19},
  {&(_tg__ZTV5E15x7__7G15x7y6[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y6[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y6[3]),  3,4},
  {&(_ZTV7G15x7y6[11]),  11,19},
  {&(_ZTV7G15x7y6[14]),  14,19},
  {&(_ZTV7G15x7y6[18]),  18,19},
  {&(_tg__ZTV3C15__7G15x7y6[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y6[];
extern  VTBL_ENTRY _ZTV7G15x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y6[];
Class_Descriptor cd_G15x7y6 = {  "G15x7y6", // class name
  bases_G15x7y6, 6,
  &(vtc_G15x7y6[0]), // expected_vtbl_contents
  &(vtt_G15x7y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G15x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y6),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G15x7y7  : virtual E15x7 , virtual F0 {
  int ff;
  ~G15x7y7(); // tgen
  G15x7y7(); // tgen
};
//SIG(1 G15x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v2 Fi} Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G15x7y7 ::~G15x7y7(){ note_dtor("G15x7y7", this);} // tgen
G15x7y7 ::G15x7y7(){ note_ctor("G15x7y7", this);} // tgen

static void Test_G15x7y7()
{
  extern Class_Descriptor cd_G15x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G15x7y7, buf);
    G15x7y7 *dp, &lv = *(dp=new (buf) G15x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G15x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G15x7y7)");
    check_base_class_offset(lv, (A1*)(C15*), ABISELECT(48,24), "G15x7y7");
    check_base_class_offset(lv, (B1*)(C15*), ABISELECT(64,32), "G15x7y7");
    check_base_class_offset(lv, (C15*)(E15x7*), ABISELECT(32,16), "G15x7y7");
    check_base_class_offset(lv, (D0*)(E15x7*), ABISELECT(76,40), "G15x7y7");
    check_base_class_offset(lv, (E15x7*), ABISELECT(16,8), "G15x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(80,44), "G15x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G15x7y7.ff");
    test_class_info(&lv, &cd_G15x7y7);
    dp->~G15x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG15x7y7(Test_G15x7y7, "G15x7y7", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G15x7y7C1Ev();
extern void _ZN7G15x7y7D1Ev();
Name_Map name_map_G15x7y7[] = {
  NSPAIR(_ZN7G15x7y7C1Ev),
  NSPAIR(_ZN7G15x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C15;
extern VTBL_ENTRY _ZTI3C15[];
extern  VTBL_ENTRY _ZTV3C15[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C15[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E15x7;
extern VTBL_ENTRY _ZTI5E15x7[];
extern  VTBL_ENTRY _ZTV5E15x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E15x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G15x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    18, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,32), //bcp->offset
    22, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C15,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E15x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(80,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G15x7y7[];
extern void _ZN2A13fooEv();
extern void _ZN2B13fooEv();
static  VTBL_ENTRY vtc_G15x7y7[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G15x7y7[0]),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G15x7y7[0]),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G15x7y7[0]),
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G15x7y7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
  0,
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI7G15x7y7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
extern VTBL_ENTRY _ZTV7G15x7y7[];
static  VTBL_ENTRY _tg__ZTV5E15x7__7G15x7y7[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
static  VTBL_ENTRY _tg__ZTV3C15__5E15x7__7G15x7y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__5E15x7__7G15x7y7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__5E15x7__7G15x7y7[] = {
  0,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E15x7[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTBL_ENTRY _tg__ZTV3C15__7G15x7y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C15[0]),
};
extern void _ZN2A13fooEv();
static  VTBL_ENTRY _tg__ZTV2A1__3C15__7G15x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2A13fooEv,
};
extern void _ZN2B13fooEv();
static  VTBL_ENTRY _tg__ZTV2B1__3C15__7G15x7y7[] = {
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C15[0]),
  (VTBL_ENTRY)&_ZN2B13fooEv,
};
static  VTT_ENTRY vtt_G15x7y7[] = {
  {&(_ZTV7G15x7y7[8]),  8,26},
  {&(_ZTV7G15x7y7[14]),  14,26},
  {&(_ZTV7G15x7y7[18]),  18,26},
  {&(_ZTV7G15x7y7[21]),  21,26},
  {&(_ZTV7G15x7y7[25]),  25,26},
  {&(_tg__ZTV5E15x7__7G15x7y7[6]),  6,6},
  {&(_tg__ZTV3C15__5E15x7__7G15x7y7[4]),  4,4},
  {&(_tg__ZTV2A1__5E15x7__7G15x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E15x7__7G15x7y7[3]),  3,4},
  {&(_tg__ZTV3C15__7G15x7y7[4]),  4,4},
  {&(_tg__ZTV2A1__3C15__7G15x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C15__7G15x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G15x7y7[];
extern  VTBL_ENTRY _ZTV7G15x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G15x7y7[];
Class_Descriptor cd_G15x7y7 = {  "G15x7y7", // class name
  bases_G15x7y7, 6,
  &(vtc_G15x7y7[0]), // expected_vtbl_contents
  &(vtt_G15x7y7[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G15x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G15x7y7),26, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G15x7y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E16x7  : virtual C16 , virtual D0 {
  int fd;
  ~E16x7(); // tgen
  E16x7(); // tgen
};
//SIG(-1 E16x7) C1{ VBC2{ BC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E16x7 ::~E16x7(){ note_dtor("E16x7", this);} // tgen
E16x7 ::E16x7(){ note_ctor("E16x7", this);} // tgen

static void Test_E16x7()
{
  extern Class_Descriptor cd_E16x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E16x7, buf);
    E16x7 *dp, &lv = *(dp=new (buf) E16x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E16x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E16x7)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,12), "E16x7");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,16), "E16x7");
    check_base_class_offset(lv, (C16*), ABISELECT(16,8), "E16x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E16x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E16x7.fd");
    test_class_info(&lv, &cd_E16x7);
    dp->~E16x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE16x7(Test_E16x7, "E16x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E16x7C1Ev();
extern void _ZN5E16x7D1Ev();
Name_Map name_map_E16x7[] = {
  NSPAIR(_ZN5E16x7C1Ev),
  NSPAIR(_ZN5E16x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E16x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E16x7[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_E16x7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV5E16x7[];
static  VTT_ENTRY vtt_E16x7[] = {
  {&(_ZTV5E16x7[4]),  4,8},
  {&(_ZTV5E16x7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
Class_Descriptor cd_E16x7 = {  "E16x7", // class name
  bases_E16x7, 4,
  &(vtc_E16x7[0]), // expected_vtbl_contents
  &(vtt_E16x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E16x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E16x7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E16x7),2, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y0  : E16x7 , F1 {
  int ff;
  ~G16x7y0(); // tgen
  G16x7y0(); // tgen
};
//SIG(1 G16x7y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x7y0 ::~G16x7y0(){ note_dtor("G16x7y0", this);} // tgen
G16x7y0 ::G16x7y0(){ note_ctor("G16x7y0", this);} // tgen

static void Test_G16x7y0()
{
  extern Class_Descriptor cd_G16x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x7y0, buf);
    G16x7y0 *dp, &lv = *(dp=new (buf) G16x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y0)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x7y0");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x7y0");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(32,20), "G16x7y0");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(52,36), "G16x7y0");
    check_base_class_offset(lv, (E16x7*), 0, "G16x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G16x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G16x7y0.ff");
    test_class_info(&lv, &cd_G16x7y0);
    dp->~G16x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y0(Test_G16x7y0, "G16x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x7y0C1Ev();
extern void _ZN7G16x7y0D1Ev();
Name_Map name_map_G16x7y0[] = {
  NSPAIR(_ZN7G16x7y0C1Ev),
  NSPAIR(_ZN7G16x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G16x7y0[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y0[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y0[] = {
  {&(_ZTV7G16x7y0[4]),  4,11},
  {&(_tg__ZTV5E16x7__7G16x7y0[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y0[3]),  3,4},
  {&(_ZTV7G16x7y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G16x7y0[];
extern  VTBL_ENTRY _ZTV7G16x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y0[];
Class_Descriptor cd_G16x7y0 = {  "G16x7y0", // class name
  bases_G16x7y0, 6,
  &(vtc_G16x7y0[0]), // expected_vtbl_contents
  &(vtt_G16x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y0),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y1  : virtual E16x7 , F1 {
  int ff;
  ~G16x7y1(); // tgen
  G16x7y1(); // tgen
};
//SIG(1 G16x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G16x7y1 ::~G16x7y1(){ note_dtor("G16x7y1", this);} // tgen
G16x7y1 ::G16x7y1(){ note_ctor("G16x7y1", this);} // tgen

static void Test_G16x7y1()
{
  extern Class_Descriptor cd_G16x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x7y1, buf);
    G16x7y1 *dp, &lv = *(dp=new (buf) G16x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y1)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x7y1");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x7y1");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(32,20), "G16x7y1");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(52,36), "G16x7y1");
    check_base_class_offset(lv, (E16x7*), ABISELECT(16,12), "G16x7y1");
    check_base_class_offset(lv, (F1*), 0, "G16x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x7y1.ff");
    test_class_info(&lv, &cd_G16x7y1);
    dp->~G16x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y1(Test_G16x7y1, "G16x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x7y1C1Ev();
extern void _ZN7G16x7y1D1Ev();
Name_Map name_map_G16x7y1[] = {
  NSPAIR(_ZN7G16x7y1C1Ev),
  NSPAIR(_ZN7G16x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G16x7y1[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y1[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y1[] = {
  {&(_ZTV7G16x7y1[5]),  5,14},
  {&(_ZTV7G16x7y1[10]),  10,14},
  {&(_ZTV7G16x7y1[13]),  13,14},
  {&(_tg__ZTV5E16x7__7G16x7y1[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x7y1[];
extern  VTBL_ENTRY _ZTV7G16x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y1[];
Class_Descriptor cd_G16x7y1 = {  "G16x7y1", // class name
  bases_G16x7y1, 6,
  &(vtc_G16x7y1[0]), // expected_vtbl_contents
  &(vtt_G16x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y1),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y2  : E16x7 , virtual F1 {
  int ff;
  ~G16x7y2(); // tgen
  G16x7y2(); // tgen
};
//SIG(1 G16x7y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x7y2 ::~G16x7y2(){ note_dtor("G16x7y2", this);} // tgen
G16x7y2 ::G16x7y2(){ note_ctor("G16x7y2", this);} // tgen

static void Test_G16x7y2()
{
  extern Class_Descriptor cd_G16x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x7y2, buf);
    G16x7y2 *dp, &lv = *(dp=new (buf) G16x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y2)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,16), "G16x7y2");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,20), "G16x7y2");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(16,12), "G16x7y2");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(36,28), "G16x7y2");
    check_base_class_offset(lv, (E16x7*), 0, "G16x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G16x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x7y2.ff");
    test_class_info(&lv, &cd_G16x7y2);
    dp->~G16x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y2(Test_G16x7y2, "G16x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x7y2C1Ev();
extern void _ZN7G16x7y2D1Ev();
Name_Map name_map_G16x7y2[] = {
  NSPAIR(_ZN7G16x7y2C1Ev),
  NSPAIR(_ZN7G16x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y2[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x7y2[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G16x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y2[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y2[] = {
  {&(_ZTV7G16x7y2[5]),  5,13},
  {&(_tg__ZTV5E16x7__7G16x7y2[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y2[3]),  3,4},
  {&(_ZTV7G16x7y2[8]),  8,13},
  {&(_ZTV7G16x7y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G16x7y2[];
extern  VTBL_ENTRY _ZTV7G16x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y2[];
Class_Descriptor cd_G16x7y2 = {  "G16x7y2", // class name
  bases_G16x7y2, 6,
  &(vtc_G16x7y2[0]), // expected_vtbl_contents
  &(vtt_G16x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y2),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y3  : virtual E16x7 , virtual F1 {
  int ff;
  ~G16x7y3(); // tgen
  G16x7y3(); // tgen
};
//SIG(1 G16x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G16x7y3 ::~G16x7y3(){ note_dtor("G16x7y3", this);} // tgen
G16x7y3 ::G16x7y3(){ note_ctor("G16x7y3", this);} // tgen

static void Test_G16x7y3()
{
  extern Class_Descriptor cd_G16x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G16x7y3, buf);
    G16x7y3 *dp, &lv = *(dp=new (buf) G16x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G16x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y3)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,20), "G16x7y3");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,24), "G16x7y3");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(32,16), "G16x7y3");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(52,32), "G16x7y3");
    check_base_class_offset(lv, (E16x7*), ABISELECT(16,8), "G16x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G16x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x7y3.ff");
    test_class_info(&lv, &cd_G16x7y3);
    dp->~G16x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y3(Test_G16x7y3, "G16x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G16x7y3C1Ev();
extern void _ZN7G16x7y3D1Ev();
Name_Map name_map_G16x7y3[] = {
  NSPAIR(_ZN7G16x7y3C1Ev),
  NSPAIR(_ZN7G16x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G16x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y3[];
extern void _ZN3C163fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G16x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G16x7y3[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G16x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y3[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y3[] = {
  {&(_ZTV7G16x7y3[6]),  6,18},
  {&(_ZTV7G16x7y3[10]),  10,18},
  {&(_ZTV7G16x7y3[13]),  13,18},
  {&(_ZTV7G16x7y3[17]),  17,18},
  {&(_tg__ZTV5E16x7__7G16x7y3[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x7y3[];
extern  VTBL_ENTRY _ZTV7G16x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y3[];
Class_Descriptor cd_G16x7y3 = {  "G16x7y3", // class name
  bases_G16x7y3, 6,
  &(vtc_G16x7y3[0]), // expected_vtbl_contents
  &(vtt_G16x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G16x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y3),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y4  : E16x7 , F0 {
  int ff;
  ~G16x7y4(); // tgen
  G16x7y4(); // tgen
};
//SIG(1 G16x7y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G16x7y4 ::~G16x7y4(){ note_dtor("G16x7y4", this);} // tgen
G16x7y4 ::G16x7y4(){ note_ctor("G16x7y4", this);} // tgen

static void Test_G16x7y4()
{
  extern Class_Descriptor cd_G16x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x7y4, buf);
    G16x7y4 *dp, &lv = *(dp=new (buf) G16x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y4)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(32,20), "G16x7y4");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(36,24), "G16x7y4");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(24,16), "G16x7y4");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(44,32), "G16x7y4");
    check_base_class_offset(lv, (E16x7*), 0, "G16x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G16x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G16x7y4.ff");
    test_class_info(&lv, &cd_G16x7y4);
    dp->~G16x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y4(Test_G16x7y4, "G16x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x7y4C1Ev();
extern void _ZN7G16x7y4D1Ev();
Name_Map name_map_G16x7y4[] = {
  NSPAIR(_ZN7G16x7y4C1Ev),
  NSPAIR(_ZN7G16x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y4[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G16x7y4[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y4[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y4[] = {
  {&(_ZTV7G16x7y4[4]),  4,8},
  {&(_tg__ZTV5E16x7__7G16x7y4[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y4[3]),  3,4},
  {&(_ZTV7G16x7y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G16x7y4[];
extern  VTBL_ENTRY _ZTV7G16x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y4[];
Class_Descriptor cd_G16x7y4 = {  "G16x7y4", // class name
  bases_G16x7y4, 6,
  &(vtc_G16x7y4[0]), // expected_vtbl_contents
  &(vtt_G16x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y4),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y5  : virtual E16x7 , F0 {
  int ff;
  ~G16x7y5(); // tgen
  G16x7y5(); // tgen
};
//SIG(1 G16x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G16x7y5 ::~G16x7y5(){ note_dtor("G16x7y5", this);} // tgen
G16x7y5 ::G16x7y5(){ note_ctor("G16x7y5", this);} // tgen

static void Test_G16x7y5()
{
  extern Class_Descriptor cd_G16x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G16x7y5, buf);
    G16x7y5 *dp, &lv = *(dp=new (buf) G16x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G16x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y5)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,24), "G16x7y5");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,28), "G16x7y5");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(32,20), "G16x7y5");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(52,36), "G16x7y5");
    check_base_class_offset(lv, (E16x7*), ABISELECT(16,12), "G16x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G16x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x7y5.ff");
    test_class_info(&lv, &cd_G16x7y5);
    dp->~G16x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y5(Test_G16x7y5, "G16x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G16x7y5C1Ev();
extern void _ZN7G16x7y5D1Ev();
Name_Map name_map_G16x7y5[] = {
  NSPAIR(_ZN7G16x7y5C1Ev),
  NSPAIR(_ZN7G16x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y5[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G16x7y5[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y5[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y5[] = {
  {&(_ZTV7G16x7y5[5]),  5,13},
  {&(_ZTV7G16x7y5[9]),  9,13},
  {&(_ZTV7G16x7y5[12]),  12,13},
  {&(_tg__ZTV5E16x7__7G16x7y5[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x7y5[];
extern  VTBL_ENTRY _ZTV7G16x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y5[];
Class_Descriptor cd_G16x7y5 = {  "G16x7y5", // class name
  bases_G16x7y5, 6,
  &(vtc_G16x7y5[0]), // expected_vtbl_contents
  &(vtt_G16x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G16x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y5),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y6  : E16x7 , virtual F0 {
  int ff;
  ~G16x7y6(); // tgen
  G16x7y6(); // tgen
};
//SIG(1 G16x7y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x7y6 ::~G16x7y6(){ note_dtor("G16x7y6", this);} // tgen
G16x7y6 ::G16x7y6(){ note_ctor("G16x7y6", this);} // tgen

static void Test_G16x7y6()
{
  extern Class_Descriptor cd_G16x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G16x7y6, buf);
    G16x7y6 *dp, &lv = *(dp=new (buf) G16x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G16x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y6)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(24,16), "G16x7y6");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(28,20), "G16x7y6");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(16,12), "G16x7y6");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(36,28), "G16x7y6");
    check_base_class_offset(lv, (E16x7*), 0, "G16x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G16x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G16x7y6.ff");
    test_class_info(&lv, &cd_G16x7y6);
    dp->~G16x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y6(Test_G16x7y6, "G16x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G16x7y6C1Ev();
extern void _ZN7G16x7y6D1Ev();
Name_Map name_map_G16x7y6[] = {
  NSPAIR(_ZN7G16x7y6C1Ev),
  NSPAIR(_ZN7G16x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y6[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G16x7y6[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y6[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y6[] = {
  {&(_ZTV7G16x7y6[5]),  5,9},
  {&(_tg__ZTV5E16x7__7G16x7y6[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y6[3]),  3,4},
  {&(_ZTV7G16x7y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G16x7y6[];
extern  VTBL_ENTRY _ZTV7G16x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y6[];
Class_Descriptor cd_G16x7y6 = {  "G16x7y6", // class name
  bases_G16x7y6, 6,
  &(vtc_G16x7y6[0]), // expected_vtbl_contents
  &(vtt_G16x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G16x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y6),4, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G16x7y7  : virtual E16x7 , virtual F0 {
  int ff;
  ~G16x7y7(); // tgen
  G16x7y7(); // tgen
};
//SIG(1 G16x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G16x7y7 ::~G16x7y7(){ note_dtor("G16x7y7", this);} // tgen
G16x7y7 ::G16x7y7(){ note_ctor("G16x7y7", this);} // tgen

static void Test_G16x7y7()
{
  extern Class_Descriptor cd_G16x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G16x7y7, buf);
    G16x7y7 *dp, &lv = *(dp=new (buf) G16x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G16x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G16x7y7)");
    check_base_class_offset(lv, (A0*)(C16*), ABISELECT(40,20), "G16x7y7");
    check_base_class_offset(lv, (B0*)(C16*), ABISELECT(44,24), "G16x7y7");
    check_base_class_offset(lv, (C16*)(E16x7*), ABISELECT(32,16), "G16x7y7");
    check_base_class_offset(lv, (D0*)(E16x7*), ABISELECT(52,32), "G16x7y7");
    check_base_class_offset(lv, (E16x7*), ABISELECT(16,8), "G16x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G16x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G16x7y7.ff");
    test_class_info(&lv, &cd_G16x7y7);
    dp->~G16x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG16x7y7(Test_G16x7y7, "G16x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G16x7y7C1Ev();
extern void _ZN7G16x7y7D1Ev();
Name_Map name_map_G16x7y7[] = {
  NSPAIR(_ZN7G16x7y7C1Ev),
  NSPAIR(_ZN7G16x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C16;
extern VTBL_ENTRY _ZTI3C16[];
extern  VTBL_ENTRY _ZTV3C16[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E16x7;
extern VTBL_ENTRY _ZTI5E16x7[];
extern  VTBL_ENTRY _ZTV5E16x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E16x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G16x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C16,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E16x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G16x7y7[];
extern void _ZN3C163fooEv();
static  VTBL_ENTRY vtc_G16x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G16x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G16x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G16x7y7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
extern VTBL_ENTRY _ZTV7G16x7y7[];
static  VTBL_ENTRY _tg__ZTV5E16x7__7G16x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
};
extern void _ZN3C163fooEv();
static  VTBL_ENTRY _tg__ZTV3C16__5E16x7__7G16x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E16x7[0]),
  (VTBL_ENTRY)&_ZN3C163fooEv,
};
static  VTT_ENTRY vtt_G16x7y7[] = {
  {&(_ZTV7G16x7y7[6]),  6,14},
  {&(_ZTV7G16x7y7[10]),  10,14},
  {&(_ZTV7G16x7y7[13]),  13,14},
  {&(_tg__ZTV5E16x7__7G16x7y7[4]),  4,4},
  {&(_tg__ZTV3C16__5E16x7__7G16x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G16x7y7[];
extern  VTBL_ENTRY _ZTV7G16x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G16x7y7[];
Class_Descriptor cd_G16x7y7 = {  "G16x7y7", // class name
  bases_G16x7y7, 6,
  &(vtc_G16x7y7[0]), // expected_vtbl_contents
  &(vtt_G16x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G16x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G16x7y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G16x7y7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E17x7  : virtual C17 , virtual D0 {
  int fd;
  ~E17x7(); // tgen
  E17x7(); // tgen
};
//SIG(-1 E17x7) C1{ VBC2{ BC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E17x7 ::~E17x7(){ note_dtor("E17x7", this);} // tgen
E17x7 ::E17x7(){ note_ctor("E17x7", this);} // tgen

static void Test_E17x7()
{
  extern Class_Descriptor cd_E17x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E17x7, buf);
    E17x7 *dp, &lv = *(dp=new (buf) E17x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E17x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E17x7)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,8), "E17x7");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,16), "E17x7");
    check_base_class_offset(lv, (C17*), ABISELECT(16,8), "E17x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E17x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E17x7.fd");
    test_class_info(&lv, &cd_E17x7);
    dp->~E17x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE17x7(Test_E17x7, "E17x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E17x7C1Ev();
extern void _ZN5E17x7D1Ev();
Name_Map name_map_E17x7[] = {
  NSPAIR(_ZN5E17x7C1Ev),
  NSPAIR(_ZN5E17x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E17x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E17x7[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_E17x7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV5E17x7[];
static  VTT_ENTRY vtt_E17x7[] = {
  {&(_ZTV5E17x7[4]),  4,8},
  {&(_ZTV5E17x7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
Class_Descriptor cd_E17x7 = {  "E17x7", // class name
  bases_E17x7, 4,
  &(vtc_E17x7[0]), // expected_vtbl_contents
  &(vtt_E17x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E17x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E17x7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E17x7),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y0  : E17x7 , F1 {
  int ff;
  ~G17x7y0(); // tgen
  G17x7y0(); // tgen
};
//SIG(1 G17x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x7y0 ::~G17x7y0(){ note_dtor("G17x7y0", this);} // tgen
G17x7y0 ::G17x7y0(){ note_ctor("G17x7y0", this);} // tgen

static void Test_G17x7y0()
{
  extern Class_Descriptor cd_G17x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x7y0, buf);
    G17x7y0 *dp, &lv = *(dp=new (buf) G17x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y0)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x7y0");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x7y0");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(32,20), "G17x7y0");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(52,36), "G17x7y0");
    check_base_class_offset(lv, (E17x7*), 0, "G17x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G17x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G17x7y0.ff");
    test_class_info(&lv, &cd_G17x7y0);
    dp->~G17x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y0(Test_G17x7y0, "G17x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x7y0C1Ev();
extern void _ZN7G17x7y0D1Ev();
Name_Map name_map_G17x7y0[] = {
  NSPAIR(_ZN7G17x7y0C1Ev),
  NSPAIR(_ZN7G17x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G17x7y0[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y0[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y0[] = {
  {&(_ZTV7G17x7y0[4]),  4,11},
  {&(_tg__ZTV5E17x7__7G17x7y0[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y0[3]),  3,4},
  {&(_ZTV7G17x7y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G17x7y0[];
extern  VTBL_ENTRY _ZTV7G17x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y0[];
Class_Descriptor cd_G17x7y0 = {  "G17x7y0", // class name
  bases_G17x7y0, 6,
  &(vtc_G17x7y0[0]), // expected_vtbl_contents
  &(vtt_G17x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y1  : virtual E17x7 , F1 {
  int ff;
  ~G17x7y1(); // tgen
  G17x7y1(); // tgen
};
//SIG(1 G17x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G17x7y1 ::~G17x7y1(){ note_dtor("G17x7y1", this);} // tgen
G17x7y1 ::G17x7y1(){ note_ctor("G17x7y1", this);} // tgen

static void Test_G17x7y1()
{
  extern Class_Descriptor cd_G17x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x7y1, buf);
    G17x7y1 *dp, &lv = *(dp=new (buf) G17x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y1)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x7y1");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x7y1");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(32,20), "G17x7y1");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(52,36), "G17x7y1");
    check_base_class_offset(lv, (E17x7*), ABISELECT(16,12), "G17x7y1");
    check_base_class_offset(lv, (F1*), 0, "G17x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x7y1.ff");
    test_class_info(&lv, &cd_G17x7y1);
    dp->~G17x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y1(Test_G17x7y1, "G17x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x7y1C1Ev();
extern void _ZN7G17x7y1D1Ev();
Name_Map name_map_G17x7y1[] = {
  NSPAIR(_ZN7G17x7y1C1Ev),
  NSPAIR(_ZN7G17x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G17x7y1[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y1[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y1[] = {
  {&(_ZTV7G17x7y1[5]),  5,14},
  {&(_ZTV7G17x7y1[10]),  10,14},
  {&(_ZTV7G17x7y1[13]),  13,14},
  {&(_tg__ZTV5E17x7__7G17x7y1[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x7y1[];
extern  VTBL_ENTRY _ZTV7G17x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y1[];
Class_Descriptor cd_G17x7y1 = {  "G17x7y1", // class name
  bases_G17x7y1, 6,
  &(vtc_G17x7y1[0]), // expected_vtbl_contents
  &(vtt_G17x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y2  : E17x7 , virtual F1 {
  int ff;
  ~G17x7y2(); // tgen
  G17x7y2(); // tgen
};
//SIG(1 G17x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x7y2 ::~G17x7y2(){ note_dtor("G17x7y2", this);} // tgen
G17x7y2 ::G17x7y2(){ note_ctor("G17x7y2", this);} // tgen

static void Test_G17x7y2()
{
  extern Class_Descriptor cd_G17x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x7y2, buf);
    G17x7y2 *dp, &lv = *(dp=new (buf) G17x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y2)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,12), "G17x7y2");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,20), "G17x7y2");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(16,12), "G17x7y2");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(36,28), "G17x7y2");
    check_base_class_offset(lv, (E17x7*), 0, "G17x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G17x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x7y2.ff");
    test_class_info(&lv, &cd_G17x7y2);
    dp->~G17x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y2(Test_G17x7y2, "G17x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x7y2C1Ev();
extern void _ZN7G17x7y2D1Ev();
Name_Map name_map_G17x7y2[] = {
  NSPAIR(_ZN7G17x7y2C1Ev),
  NSPAIR(_ZN7G17x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y2[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x7y2[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G17x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y2[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y2[] = {
  {&(_ZTV7G17x7y2[5]),  5,13},
  {&(_tg__ZTV5E17x7__7G17x7y2[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y2[3]),  3,4},
  {&(_ZTV7G17x7y2[8]),  8,13},
  {&(_ZTV7G17x7y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G17x7y2[];
extern  VTBL_ENTRY _ZTV7G17x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y2[];
Class_Descriptor cd_G17x7y2 = {  "G17x7y2", // class name
  bases_G17x7y2, 6,
  &(vtc_G17x7y2[0]), // expected_vtbl_contents
  &(vtt_G17x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y3  : virtual E17x7 , virtual F1 {
  int ff;
  ~G17x7y3(); // tgen
  G17x7y3(); // tgen
};
//SIG(1 G17x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G17x7y3 ::~G17x7y3(){ note_dtor("G17x7y3", this);} // tgen
G17x7y3 ::G17x7y3(){ note_ctor("G17x7y3", this);} // tgen

static void Test_G17x7y3()
{
  extern Class_Descriptor cd_G17x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G17x7y3, buf);
    G17x7y3 *dp, &lv = *(dp=new (buf) G17x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G17x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y3)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,16), "G17x7y3");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,24), "G17x7y3");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(32,16), "G17x7y3");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(52,32), "G17x7y3");
    check_base_class_offset(lv, (E17x7*), ABISELECT(16,8), "G17x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G17x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x7y3.ff");
    test_class_info(&lv, &cd_G17x7y3);
    dp->~G17x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y3(Test_G17x7y3, "G17x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G17x7y3C1Ev();
extern void _ZN7G17x7y3D1Ev();
Name_Map name_map_G17x7y3[] = {
  NSPAIR(_ZN7G17x7y3C1Ev),
  NSPAIR(_ZN7G17x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G17x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y3[];
extern void _ZN3C173fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G17x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G17x7y3[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G17x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y3[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y3[] = {
  {&(_ZTV7G17x7y3[6]),  6,18},
  {&(_ZTV7G17x7y3[10]),  10,18},
  {&(_ZTV7G17x7y3[13]),  13,18},
  {&(_ZTV7G17x7y3[17]),  17,18},
  {&(_tg__ZTV5E17x7__7G17x7y3[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x7y3[];
extern  VTBL_ENTRY _ZTV7G17x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y3[];
Class_Descriptor cd_G17x7y3 = {  "G17x7y3", // class name
  bases_G17x7y3, 6,
  &(vtc_G17x7y3[0]), // expected_vtbl_contents
  &(vtt_G17x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G17x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y4  : E17x7 , F0 {
  int ff;
  ~G17x7y4(); // tgen
  G17x7y4(); // tgen
};
//SIG(1 G17x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G17x7y4 ::~G17x7y4(){ note_dtor("G17x7y4", this);} // tgen
G17x7y4 ::G17x7y4(){ note_ctor("G17x7y4", this);} // tgen

static void Test_G17x7y4()
{
  extern Class_Descriptor cd_G17x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x7y4, buf);
    G17x7y4 *dp, &lv = *(dp=new (buf) G17x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y4)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(24,16), "G17x7y4");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(36,24), "G17x7y4");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(24,16), "G17x7y4");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(44,32), "G17x7y4");
    check_base_class_offset(lv, (E17x7*), 0, "G17x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G17x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G17x7y4.ff");
    test_class_info(&lv, &cd_G17x7y4);
    dp->~G17x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y4(Test_G17x7y4, "G17x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x7y4C1Ev();
extern void _ZN7G17x7y4D1Ev();
Name_Map name_map_G17x7y4[] = {
  NSPAIR(_ZN7G17x7y4C1Ev),
  NSPAIR(_ZN7G17x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y4[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G17x7y4[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y4[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y4[] = {
  {&(_ZTV7G17x7y4[4]),  4,8},
  {&(_tg__ZTV5E17x7__7G17x7y4[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y4[3]),  3,4},
  {&(_ZTV7G17x7y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G17x7y4[];
extern  VTBL_ENTRY _ZTV7G17x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y4[];
Class_Descriptor cd_G17x7y4 = {  "G17x7y4", // class name
  bases_G17x7y4, 6,
  &(vtc_G17x7y4[0]), // expected_vtbl_contents
  &(vtt_G17x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y5  : virtual E17x7 , F0 {
  int ff;
  ~G17x7y5(); // tgen
  G17x7y5(); // tgen
};
//SIG(1 G17x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G17x7y5 ::~G17x7y5(){ note_dtor("G17x7y5", this);} // tgen
G17x7y5 ::G17x7y5(){ note_ctor("G17x7y5", this);} // tgen

static void Test_G17x7y5()
{
  extern Class_Descriptor cd_G17x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G17x7y5, buf);
    G17x7y5 *dp, &lv = *(dp=new (buf) G17x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G17x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y5)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,20), "G17x7y5");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,28), "G17x7y5");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(32,20), "G17x7y5");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(52,36), "G17x7y5");
    check_base_class_offset(lv, (E17x7*), ABISELECT(16,12), "G17x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G17x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x7y5.ff");
    test_class_info(&lv, &cd_G17x7y5);
    dp->~G17x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y5(Test_G17x7y5, "G17x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G17x7y5C1Ev();
extern void _ZN7G17x7y5D1Ev();
Name_Map name_map_G17x7y5[] = {
  NSPAIR(_ZN7G17x7y5C1Ev),
  NSPAIR(_ZN7G17x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y5[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G17x7y5[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y5[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y5[] = {
  {&(_ZTV7G17x7y5[5]),  5,13},
  {&(_ZTV7G17x7y5[9]),  9,13},
  {&(_ZTV7G17x7y5[12]),  12,13},
  {&(_tg__ZTV5E17x7__7G17x7y5[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x7y5[];
extern  VTBL_ENTRY _ZTV7G17x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y5[];
Class_Descriptor cd_G17x7y5 = {  "G17x7y5", // class name
  bases_G17x7y5, 6,
  &(vtc_G17x7y5[0]), // expected_vtbl_contents
  &(vtt_G17x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G17x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y6  : E17x7 , virtual F0 {
  int ff;
  ~G17x7y6(); // tgen
  G17x7y6(); // tgen
};
//SIG(1 G17x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x7y6 ::~G17x7y6(){ note_dtor("G17x7y6", this);} // tgen
G17x7y6 ::G17x7y6(){ note_ctor("G17x7y6", this);} // tgen

static void Test_G17x7y6()
{
  extern Class_Descriptor cd_G17x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G17x7y6, buf);
    G17x7y6 *dp, &lv = *(dp=new (buf) G17x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G17x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y6)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(16,12), "G17x7y6");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(28,20), "G17x7y6");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(16,12), "G17x7y6");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(36,28), "G17x7y6");
    check_base_class_offset(lv, (E17x7*), 0, "G17x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G17x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G17x7y6.ff");
    test_class_info(&lv, &cd_G17x7y6);
    dp->~G17x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y6(Test_G17x7y6, "G17x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G17x7y6C1Ev();
extern void _ZN7G17x7y6D1Ev();
Name_Map name_map_G17x7y6[] = {
  NSPAIR(_ZN7G17x7y6C1Ev),
  NSPAIR(_ZN7G17x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y6[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G17x7y6[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y6[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y6[] = {
  {&(_ZTV7G17x7y6[5]),  5,9},
  {&(_tg__ZTV5E17x7__7G17x7y6[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y6[3]),  3,4},
  {&(_ZTV7G17x7y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G17x7y6[];
extern  VTBL_ENTRY _ZTV7G17x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y6[];
Class_Descriptor cd_G17x7y6 = {  "G17x7y6", // class name
  bases_G17x7y6, 6,
  &(vtc_G17x7y6[0]), // expected_vtbl_contents
  &(vtt_G17x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G17x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G17x7y7  : virtual E17x7 , virtual F0 {
  int ff;
  ~G17x7y7(); // tgen
  G17x7y7(); // tgen
};
//SIG(1 G17x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G17x7y7 ::~G17x7y7(){ note_dtor("G17x7y7", this);} // tgen
G17x7y7 ::G17x7y7(){ note_ctor("G17x7y7", this);} // tgen

static void Test_G17x7y7()
{
  extern Class_Descriptor cd_G17x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G17x7y7, buf);
    G17x7y7 *dp, &lv = *(dp=new (buf) G17x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G17x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G17x7y7)");
    check_base_class_offset(lv, (A1*)(C17*), ABISELECT(32,16), "G17x7y7");
    check_base_class_offset(lv, (B0*)(C17*), ABISELECT(44,24), "G17x7y7");
    check_base_class_offset(lv, (C17*)(E17x7*), ABISELECT(32,16), "G17x7y7");
    check_base_class_offset(lv, (D0*)(E17x7*), ABISELECT(52,32), "G17x7y7");
    check_base_class_offset(lv, (E17x7*), ABISELECT(16,8), "G17x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G17x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G17x7y7.ff");
    test_class_info(&lv, &cd_G17x7y7);
    dp->~G17x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG17x7y7(Test_G17x7y7, "G17x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G17x7y7C1Ev();
extern void _ZN7G17x7y7D1Ev();
Name_Map name_map_G17x7y7[] = {
  NSPAIR(_ZN7G17x7y7C1Ev),
  NSPAIR(_ZN7G17x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C17;
extern VTBL_ENTRY _ZTI3C17[];
extern  VTBL_ENTRY _ZTV3C17[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E17x7;
extern VTBL_ENTRY _ZTI5E17x7[];
extern  VTBL_ENTRY _ZTV5E17x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E17x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G17x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C17,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E17x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G17x7y7[];
extern void _ZN3C173fooEv();
static  VTBL_ENTRY vtc_G17x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G17x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G17x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G17x7y7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
extern VTBL_ENTRY _ZTV7G17x7y7[];
static  VTBL_ENTRY _tg__ZTV5E17x7__7G17x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
};
extern void _ZN3C173fooEv();
static  VTBL_ENTRY _tg__ZTV3C17__5E17x7__7G17x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E17x7[0]),
  (VTBL_ENTRY)&_ZN3C173fooEv,
};
static  VTT_ENTRY vtt_G17x7y7[] = {
  {&(_ZTV7G17x7y7[6]),  6,14},
  {&(_ZTV7G17x7y7[10]),  10,14},
  {&(_ZTV7G17x7y7[13]),  13,14},
  {&(_tg__ZTV5E17x7__7G17x7y7[4]),  4,4},
  {&(_tg__ZTV3C17__5E17x7__7G17x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G17x7y7[];
extern  VTBL_ENTRY _ZTV7G17x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G17x7y7[];
Class_Descriptor cd_G17x7y7 = {  "G17x7y7", // class name
  bases_G17x7y7, 6,
  &(vtc_G17x7y7[0]), // expected_vtbl_contents
  &(vtt_G17x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G17x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G17x7y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G17x7y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E18x7  : virtual C18 , virtual D0 {
  int fd;
  ~E18x7(); // tgen
  E18x7(); // tgen
};
//SIG(-1 E18x7) C1{ VBC2{ VBC3{ Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E18x7 ::~E18x7(){ note_dtor("E18x7", this);} // tgen
E18x7 ::E18x7(){ note_ctor("E18x7", this);} // tgen

static void Test_E18x7()
{
  extern Class_Descriptor cd_E18x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E18x7, buf);
    E18x7 *dp, &lv = *(dp=new (buf) E18x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E18x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E18x7)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,20), "E18x7");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,12), "E18x7");
    check_base_class_offset(lv, (C18*), ABISELECT(16,8), "E18x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E18x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E18x7.fd");
    test_class_info(&lv, &cd_E18x7);
    dp->~E18x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE18x7(Test_E18x7, "E18x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E18x7C1Ev();
extern void _ZN5E18x7D1Ev();
Name_Map name_map_E18x7[] = {
  NSPAIR(_ZN5E18x7C1Ev),
  NSPAIR(_ZN5E18x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E18x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E18x7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_E18x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV5E18x7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_E18x7[] = {
  {&(_ZTV5E18x7[5]),  5,10},
  {&(_ZTV5E18x7[9]),  9,10},
  {&(_tg__ZTV3C18__5E18x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
Class_Descriptor cd_E18x7 = {  "E18x7", // class name
  bases_E18x7, 4,
  &(vtc_E18x7[0]), // expected_vtbl_contents
  &(vtt_E18x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E18x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E18x7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E18x7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y0  : E18x7 , F1 {
  int ff;
  ~G18x7y0(); // tgen
  G18x7y0(); // tgen
};
//SIG(1 G18x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x7y0 ::~G18x7y0(){ note_dtor("G18x7y0", this);} // tgen
G18x7y0 ::G18x7y0(){ note_ctor("G18x7y0", this);} // tgen

static void Test_G18x7y0()
{
  extern Class_Descriptor cd_G18x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x7y0, buf);
    G18x7y0 *dp, &lv = *(dp=new (buf) G18x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y0)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x7y0");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x7y0");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(32,20), "G18x7y0");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(52,36), "G18x7y0");
    check_base_class_offset(lv, (E18x7*), 0, "G18x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G18x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G18x7y0.ff");
    test_class_info(&lv, &cd_G18x7y0);
    dp->~G18x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y0(Test_G18x7y0, "G18x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x7y0C1Ev();
extern void _ZN7G18x7y0D1Ev();
Name_Map name_map_G18x7y0[] = {
  NSPAIR(_ZN7G18x7y0C1Ev),
  NSPAIR(_ZN7G18x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G18x7y0[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y0[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y0[] = {
  {&(_ZTV7G18x7y0[5]),  5,13},
  {&(_tg__ZTV5E18x7__7G18x7y0[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y0[4]),  4,5},
  {&(_ZTV7G18x7y0[12]),  12,13},
  {&(_tg__ZTV3C18__7G18x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y0[];
extern  VTBL_ENTRY _ZTV7G18x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y0[];
Class_Descriptor cd_G18x7y0 = {  "G18x7y0", // class name
  bases_G18x7y0, 6,
  &(vtc_G18x7y0[0]), // expected_vtbl_contents
  &(vtt_G18x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y1  : virtual E18x7 , F1 {
  int ff;
  ~G18x7y1(); // tgen
  G18x7y1(); // tgen
};
//SIG(1 G18x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G18x7y1 ::~G18x7y1(){ note_dtor("G18x7y1", this);} // tgen
G18x7y1 ::G18x7y1(){ note_ctor("G18x7y1", this);} // tgen

static void Test_G18x7y1()
{
  extern Class_Descriptor cd_G18x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x7y1, buf);
    G18x7y1 *dp, &lv = *(dp=new (buf) G18x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y1)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x7y1");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x7y1");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(32,20), "G18x7y1");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(52,36), "G18x7y1");
    check_base_class_offset(lv, (E18x7*), ABISELECT(16,12), "G18x7y1");
    check_base_class_offset(lv, (F1*), 0, "G18x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x7y1.ff");
    test_class_info(&lv, &cd_G18x7y1);
    dp->~G18x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y1(Test_G18x7y1, "G18x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x7y1C1Ev();
extern void _ZN7G18x7y1D1Ev();
Name_Map name_map_G18x7y1[] = {
  NSPAIR(_ZN7G18x7y1C1Ev),
  NSPAIR(_ZN7G18x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G18x7y1[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y1[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y1[] = {
  {&(_ZTV7G18x7y1[6]),  6,17},
  {&(_ZTV7G18x7y1[12]),  12,17},
  {&(_ZTV7G18x7y1[16]),  16,17},
  {&(_tg__ZTV5E18x7__7G18x7y1[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y1[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y1[];
extern  VTBL_ENTRY _ZTV7G18x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y1[];
Class_Descriptor cd_G18x7y1 = {  "G18x7y1", // class name
  bases_G18x7y1, 6,
  &(vtc_G18x7y1[0]), // expected_vtbl_contents
  &(vtt_G18x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y2  : E18x7 , virtual F1 {
  int ff;
  ~G18x7y2(); // tgen
  G18x7y2(); // tgen
};
//SIG(1 G18x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x7y2 ::~G18x7y2(){ note_dtor("G18x7y2", this);} // tgen
G18x7y2 ::G18x7y2(){ note_ctor("G18x7y2", this);} // tgen

static void Test_G18x7y2()
{
  extern Class_Descriptor cd_G18x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x7y2, buf);
    G18x7y2 *dp, &lv = *(dp=new (buf) G18x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y2)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,24), "G18x7y2");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,16), "G18x7y2");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(16,12), "G18x7y2");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(36,28), "G18x7y2");
    check_base_class_offset(lv, (E18x7*), 0, "G18x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G18x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x7y2.ff");
    test_class_info(&lv, &cd_G18x7y2);
    dp->~G18x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y2(Test_G18x7y2, "G18x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x7y2C1Ev();
extern void _ZN7G18x7y2D1Ev();
Name_Map name_map_G18x7y2[] = {
  NSPAIR(_ZN7G18x7y2C1Ev),
  NSPAIR(_ZN7G18x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y2[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x7y2[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G18x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y2[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y2[] = {
  {&(_ZTV7G18x7y2[6]),  6,15},
  {&(_tg__ZTV5E18x7__7G18x7y2[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y2[4]),  4,5},
  {&(_ZTV7G18x7y2[10]),  10,15},
  {&(_ZTV7G18x7y2[14]),  14,15},
  {&(_tg__ZTV3C18__7G18x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y2[];
extern  VTBL_ENTRY _ZTV7G18x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y2[];
Class_Descriptor cd_G18x7y2 = {  "G18x7y2", // class name
  bases_G18x7y2, 6,
  &(vtc_G18x7y2[0]), // expected_vtbl_contents
  &(vtt_G18x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y3  : virtual E18x7 , virtual F1 {
  int ff;
  ~G18x7y3(); // tgen
  G18x7y3(); // tgen
};
//SIG(1 G18x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G18x7y3 ::~G18x7y3(){ note_dtor("G18x7y3", this);} // tgen
G18x7y3 ::G18x7y3(){ note_ctor("G18x7y3", this);} // tgen

static void Test_G18x7y3()
{
  extern Class_Descriptor cd_G18x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G18x7y3, buf);
    G18x7y3 *dp, &lv = *(dp=new (buf) G18x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G18x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y3)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,28), "G18x7y3");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,20), "G18x7y3");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(32,16), "G18x7y3");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(52,32), "G18x7y3");
    check_base_class_offset(lv, (E18x7*), ABISELECT(16,8), "G18x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G18x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x7y3.ff");
    test_class_info(&lv, &cd_G18x7y3);
    dp->~G18x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y3(Test_G18x7y3, "G18x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G18x7y3C1Ev();
extern void _ZN7G18x7y3D1Ev();
Name_Map name_map_G18x7y3[] = {
  NSPAIR(_ZN7G18x7y3C1Ev),
  NSPAIR(_ZN7G18x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G18x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y3[];
extern void _ZN3C183fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G18x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G18x7y3[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G18x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y3[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y3[] = {
  {&(_ZTV7G18x7y3[7]),  7,21},
  {&(_ZTV7G18x7y3[12]),  12,21},
  {&(_ZTV7G18x7y3[16]),  16,21},
  {&(_ZTV7G18x7y3[20]),  20,21},
  {&(_tg__ZTV5E18x7__7G18x7y3[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y3[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y3[];
extern  VTBL_ENTRY _ZTV7G18x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y3[];
Class_Descriptor cd_G18x7y3 = {  "G18x7y3", // class name
  bases_G18x7y3, 6,
  &(vtc_G18x7y3[0]), // expected_vtbl_contents
  &(vtt_G18x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G18x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y4  : E18x7 , F0 {
  int ff;
  ~G18x7y4(); // tgen
  G18x7y4(); // tgen
};
//SIG(1 G18x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G18x7y4 ::~G18x7y4(){ note_dtor("G18x7y4", this);} // tgen
G18x7y4 ::G18x7y4(){ note_ctor("G18x7y4", this);} // tgen

static void Test_G18x7y4()
{
  extern Class_Descriptor cd_G18x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x7y4, buf);
    G18x7y4 *dp, &lv = *(dp=new (buf) G18x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y4)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(40,28), "G18x7y4");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(32,20), "G18x7y4");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(24,16), "G18x7y4");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(44,32), "G18x7y4");
    check_base_class_offset(lv, (E18x7*), 0, "G18x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G18x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G18x7y4.ff");
    test_class_info(&lv, &cd_G18x7y4);
    dp->~G18x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y4(Test_G18x7y4, "G18x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x7y4C1Ev();
extern void _ZN7G18x7y4D1Ev();
Name_Map name_map_G18x7y4[] = {
  NSPAIR(_ZN7G18x7y4C1Ev),
  NSPAIR(_ZN7G18x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y4[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G18x7y4[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y4[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y4[] = {
  {&(_ZTV7G18x7y4[5]),  5,10},
  {&(_tg__ZTV5E18x7__7G18x7y4[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y4[4]),  4,5},
  {&(_ZTV7G18x7y4[9]),  9,10},
  {&(_tg__ZTV3C18__7G18x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y4[];
extern  VTBL_ENTRY _ZTV7G18x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y4[];
Class_Descriptor cd_G18x7y4 = {  "G18x7y4", // class name
  bases_G18x7y4, 6,
  &(vtc_G18x7y4[0]), // expected_vtbl_contents
  &(vtt_G18x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y5  : virtual E18x7 , F0 {
  int ff;
  ~G18x7y5(); // tgen
  G18x7y5(); // tgen
};
//SIG(1 G18x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G18x7y5 ::~G18x7y5(){ note_dtor("G18x7y5", this);} // tgen
G18x7y5 ::G18x7y5(){ note_ctor("G18x7y5", this);} // tgen

static void Test_G18x7y5()
{
  extern Class_Descriptor cd_G18x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G18x7y5, buf);
    G18x7y5 *dp, &lv = *(dp=new (buf) G18x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G18x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y5)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,32), "G18x7y5");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,24), "G18x7y5");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(32,20), "G18x7y5");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(52,36), "G18x7y5");
    check_base_class_offset(lv, (E18x7*), ABISELECT(16,12), "G18x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G18x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x7y5.ff");
    test_class_info(&lv, &cd_G18x7y5);
    dp->~G18x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y5(Test_G18x7y5, "G18x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G18x7y5C1Ev();
extern void _ZN7G18x7y5D1Ev();
Name_Map name_map_G18x7y5[] = {
  NSPAIR(_ZN7G18x7y5C1Ev),
  NSPAIR(_ZN7G18x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y5[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G18x7y5[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y5[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y5[] = {
  {&(_ZTV7G18x7y5[6]),  6,16},
  {&(_ZTV7G18x7y5[11]),  11,16},
  {&(_ZTV7G18x7y5[15]),  15,16},
  {&(_tg__ZTV5E18x7__7G18x7y5[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y5[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y5[];
extern  VTBL_ENTRY _ZTV7G18x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y5[];
Class_Descriptor cd_G18x7y5 = {  "G18x7y5", // class name
  bases_G18x7y5, 6,
  &(vtc_G18x7y5[0]), // expected_vtbl_contents
  &(vtt_G18x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G18x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y6  : E18x7 , virtual F0 {
  int ff;
  ~G18x7y6(); // tgen
  G18x7y6(); // tgen
};
//SIG(1 G18x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x7y6 ::~G18x7y6(){ note_dtor("G18x7y6", this);} // tgen
G18x7y6 ::G18x7y6(){ note_ctor("G18x7y6", this);} // tgen

static void Test_G18x7y6()
{
  extern Class_Descriptor cd_G18x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G18x7y6, buf);
    G18x7y6 *dp, &lv = *(dp=new (buf) G18x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G18x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y6)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(32,24), "G18x7y6");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(24,16), "G18x7y6");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(16,12), "G18x7y6");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(36,28), "G18x7y6");
    check_base_class_offset(lv, (E18x7*), 0, "G18x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G18x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G18x7y6.ff");
    test_class_info(&lv, &cd_G18x7y6);
    dp->~G18x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y6(Test_G18x7y6, "G18x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G18x7y6C1Ev();
extern void _ZN7G18x7y6D1Ev();
Name_Map name_map_G18x7y6[] = {
  NSPAIR(_ZN7G18x7y6C1Ev),
  NSPAIR(_ZN7G18x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y6[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G18x7y6[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y6[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y6[] = {
  {&(_ZTV7G18x7y6[6]),  6,11},
  {&(_tg__ZTV5E18x7__7G18x7y6[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y6[4]),  4,5},
  {&(_ZTV7G18x7y6[10]),  10,11},
  {&(_tg__ZTV3C18__7G18x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y6[];
extern  VTBL_ENTRY _ZTV7G18x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y6[];
Class_Descriptor cd_G18x7y6 = {  "G18x7y6", // class name
  bases_G18x7y6, 6,
  &(vtc_G18x7y6[0]), // expected_vtbl_contents
  &(vtt_G18x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G18x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G18x7y7  : virtual E18x7 , virtual F0 {
  int ff;
  ~G18x7y7(); // tgen
  G18x7y7(); // tgen
};
//SIG(1 G18x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G18x7y7 ::~G18x7y7(){ note_dtor("G18x7y7", this);} // tgen
G18x7y7 ::G18x7y7(){ note_ctor("G18x7y7", this);} // tgen

static void Test_G18x7y7()
{
  extern Class_Descriptor cd_G18x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G18x7y7, buf);
    G18x7y7 *dp, &lv = *(dp=new (buf) G18x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G18x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G18x7y7)");
    check_base_class_offset(lv, (A0*)(C18*), ABISELECT(48,28), "G18x7y7");
    check_base_class_offset(lv, (B0*)(C18*), ABISELECT(40,20), "G18x7y7");
    check_base_class_offset(lv, (C18*)(E18x7*), ABISELECT(32,16), "G18x7y7");
    check_base_class_offset(lv, (D0*)(E18x7*), ABISELECT(52,32), "G18x7y7");
    check_base_class_offset(lv, (E18x7*), ABISELECT(16,8), "G18x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G18x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G18x7y7.ff");
    test_class_info(&lv, &cd_G18x7y7);
    dp->~G18x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG18x7y7(Test_G18x7y7, "G18x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G18x7y7C1Ev();
extern void _ZN7G18x7y7D1Ev();
Name_Map name_map_G18x7y7[] = {
  NSPAIR(_ZN7G18x7y7C1Ev),
  NSPAIR(_ZN7G18x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C18;
extern VTBL_ENTRY _ZTI3C18[];
extern  VTBL_ENTRY _ZTV3C18[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C18[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E18x7;
extern VTBL_ENTRY _ZTI5E18x7[];
extern  VTBL_ENTRY _ZTV5E18x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E18x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G18x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C18,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E18x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G18x7y7[];
extern void _ZN3C183fooEv();
static  VTBL_ENTRY vtc_G18x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G18x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G18x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G18x7y7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern VTBL_ENTRY _ZTV7G18x7y7[];
static  VTBL_ENTRY _tg__ZTV5E18x7__7G18x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__5E18x7__7G18x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E18x7[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
extern void _ZN3C183fooEv();
static  VTBL_ENTRY _tg__ZTV3C18__7G18x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C18[0]),
  (VTBL_ENTRY)&_ZN3C183fooEv,
};
static  VTT_ENTRY vtt_G18x7y7[] = {
  {&(_ZTV7G18x7y7[7]),  7,17},
  {&(_ZTV7G18x7y7[12]),  12,17},
  {&(_ZTV7G18x7y7[16]),  16,17},
  {&(_tg__ZTV5E18x7__7G18x7y7[5]),  5,5},
  {&(_tg__ZTV3C18__5E18x7__7G18x7y7[4]),  4,5},
  {&(_tg__ZTV3C18__7G18x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G18x7y7[];
extern  VTBL_ENTRY _ZTV7G18x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G18x7y7[];
Class_Descriptor cd_G18x7y7 = {  "G18x7y7", // class name
  bases_G18x7y7, 6,
  &(vtc_G18x7y7[0]), // expected_vtbl_contents
  &(vtt_G18x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G18x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G18x7y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G18x7y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E19x7  : virtual C19 , virtual D0 {
  int fd;
  ~E19x7(); // tgen
  E19x7(); // tgen
};
//SIG(-1 E19x7) C1{ VBC2{ VBC3{ v1 Fi} BC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E19x7 ::~E19x7(){ note_dtor("E19x7", this);} // tgen
E19x7 ::E19x7(){ note_ctor("E19x7", this);} // tgen

static void Test_E19x7()
{
  extern Class_Descriptor cd_E19x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E19x7, buf);
    E19x7 *dp, &lv = *(dp=new (buf) E19x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E19x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E19x7)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,20), "E19x7");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,12), "E19x7");
    check_base_class_offset(lv, (C19*), ABISELECT(16,8), "E19x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E19x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E19x7.fd");
    test_class_info(&lv, &cd_E19x7);
    dp->~E19x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE19x7(Test_E19x7, "E19x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E19x7C1Ev();
extern void _ZN5E19x7D1Ev();
Name_Map name_map_E19x7[] = {
  NSPAIR(_ZN5E19x7C1Ev),
  NSPAIR(_ZN5E19x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E19x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E19x7[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E19x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV5E19x7[];
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__5E19x7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_E19x7[] = {
  {&(_ZTV5E19x7[5]),  5,14},
  {&(_ZTV5E19x7[9]),  9,14},
  {&(_ZTV5E19x7[13]),  13,14},
  {&(_tg__ZTV3C19__5E19x7[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__5E19x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
static VTBL_ENTRY alt_thunk_names197[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E19x7 = {  "E19x7", // class name
  bases_E19x7, 4,
  &(vtc_E19x7[0]), // expected_vtbl_contents
  &(vtt_E19x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E19x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E19x7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E19x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names197,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y0  : E19x7 , F1 {
  int ff;
  ~G19x7y0(); // tgen
  G19x7y0(); // tgen
};
//SIG(1 G19x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x7y0 ::~G19x7y0(){ note_dtor("G19x7y0", this);} // tgen
G19x7y0 ::G19x7y0(){ note_ctor("G19x7y0", this);} // tgen

static void Test_G19x7y0()
{
  extern Class_Descriptor cd_G19x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x7y0, buf);
    G19x7y0 *dp, &lv = *(dp=new (buf) G19x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y0)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x7y0");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x7y0");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(32,20), "G19x7y0");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(60,40), "G19x7y0");
    check_base_class_offset(lv, (E19x7*), 0, "G19x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G19x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G19x7y0.ff");
    test_class_info(&lv, &cd_G19x7y0);
    dp->~G19x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y0(Test_G19x7y0, "G19x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x7y0C1Ev();
extern void _ZN7G19x7y0D1Ev();
Name_Map name_map_G19x7y0[] = {
  NSPAIR(_ZN7G19x7y0C1Ev),
  NSPAIR(_ZN7G19x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G19x7y0[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G19x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x7y0[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y0[] = {
  {&(_ZTV7G19x7y0[5]),  5,17},
  {&(_tg__ZTV5E19x7__7G19x7y0[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y0[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y0[3]),  3,4},
  {&(_ZTV7G19x7y0[12]),  12,17},
  {&(_ZTV7G19x7y0[16]),  16,17},
  {&(_tg__ZTV3C19__7G19x7y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y0[];
extern  VTBL_ENTRY _ZTV7G19x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y0[];
static VTBL_ENTRY alt_thunk_names198[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y0 = {  "G19x7y0", // class name
  bases_G19x7y0, 6,
  &(vtc_G19x7y0[0]), // expected_vtbl_contents
  &(vtt_G19x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names198,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y1  : virtual E19x7 , F1 {
  int ff;
  ~G19x7y1(); // tgen
  G19x7y1(); // tgen
};
//SIG(1 G19x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G19x7y1 ::~G19x7y1(){ note_dtor("G19x7y1", this);} // tgen
G19x7y1 ::G19x7y1(){ note_ctor("G19x7y1", this);} // tgen

static void Test_G19x7y1()
{
  extern Class_Descriptor cd_G19x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x7y1, buf);
    G19x7y1 *dp, &lv = *(dp=new (buf) G19x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y1)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x7y1");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x7y1");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(32,20), "G19x7y1");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(60,40), "G19x7y1");
    check_base_class_offset(lv, (E19x7*), ABISELECT(16,12), "G19x7y1");
    check_base_class_offset(lv, (F1*), 0, "G19x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x7y1.ff");
    test_class_info(&lv, &cd_G19x7y1);
    dp->~G19x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y1(Test_G19x7y1, "G19x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x7y1C1Ev();
extern void _ZN7G19x7y1D1Ev();
Name_Map name_map_G19x7y1[] = {
  NSPAIR(_ZN7G19x7y1C1Ev),
  NSPAIR(_ZN7G19x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G19x7y1[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G19x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x7y1[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y1[] = {
  {&(_ZTV7G19x7y1[6]),  6,21},
  {&(_ZTV7G19x7y1[12]),  12,21},
  {&(_ZTV7G19x7y1[16]),  16,21},
  {&(_ZTV7G19x7y1[20]),  20,21},
  {&(_tg__ZTV5E19x7__7G19x7y1[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y1[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y1[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x7y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y1[];
extern  VTBL_ENTRY _ZTV7G19x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y1[];
static VTBL_ENTRY alt_thunk_names199[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y1 = {  "G19x7y1", // class name
  bases_G19x7y1, 6,
  &(vtc_G19x7y1[0]), // expected_vtbl_contents
  &(vtt_G19x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names199,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y2  : E19x7 , virtual F1 {
  int ff;
  ~G19x7y2(); // tgen
  G19x7y2(); // tgen
};
//SIG(1 G19x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x7y2 ::~G19x7y2(){ note_dtor("G19x7y2", this);} // tgen
G19x7y2 ::G19x7y2(){ note_ctor("G19x7y2", this);} // tgen

static void Test_G19x7y2()
{
  extern Class_Descriptor cd_G19x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x7y2, buf);
    G19x7y2 *dp, &lv = *(dp=new (buf) G19x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y2)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,24), "G19x7y2");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,16), "G19x7y2");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(16,12), "G19x7y2");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(44,32), "G19x7y2");
    check_base_class_offset(lv, (E19x7*), 0, "G19x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G19x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x7y2.ff");
    test_class_info(&lv, &cd_G19x7y2);
    dp->~G19x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y2(Test_G19x7y2, "G19x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x7y2C1Ev();
extern void _ZN7G19x7y2D1Ev();
Name_Map name_map_G19x7y2[] = {
  NSPAIR(_ZN7G19x7y2C1Ev),
  NSPAIR(_ZN7G19x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y2[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x7y2[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G19x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x7y2[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y2[] = {
  {&(_ZTV7G19x7y2[6]),  6,19},
  {&(_tg__ZTV5E19x7__7G19x7y2[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y2[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y2[3]),  3,4},
  {&(_ZTV7G19x7y2[10]),  10,19},
  {&(_ZTV7G19x7y2[14]),  14,19},
  {&(_ZTV7G19x7y2[18]),  18,19},
  {&(_tg__ZTV3C19__7G19x7y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y2[];
extern  VTBL_ENTRY _ZTV7G19x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y2[];
static VTBL_ENTRY alt_thunk_names200[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y2 = {  "G19x7y2", // class name
  bases_G19x7y2, 6,
  &(vtc_G19x7y2[0]), // expected_vtbl_contents
  &(vtt_G19x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names200,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y3  : virtual E19x7 , virtual F1 {
  int ff;
  ~G19x7y3(); // tgen
  G19x7y3(); // tgen
};
//SIG(1 G19x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G19x7y3 ::~G19x7y3(){ note_dtor("G19x7y3", this);} // tgen
G19x7y3 ::G19x7y3(){ note_ctor("G19x7y3", this);} // tgen

static void Test_G19x7y3()
{
  extern Class_Descriptor cd_G19x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G19x7y3, buf);
    G19x7y3 *dp, &lv = *(dp=new (buf) G19x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G19x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y3)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,28), "G19x7y3");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,20), "G19x7y3");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(32,16), "G19x7y3");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(60,36), "G19x7y3");
    check_base_class_offset(lv, (E19x7*), ABISELECT(16,8), "G19x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G19x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x7y3.ff");
    test_class_info(&lv, &cd_G19x7y3);
    dp->~G19x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y3(Test_G19x7y3, "G19x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G19x7y3C1Ev();
extern void _ZN7G19x7y3D1Ev();
Name_Map name_map_G19x7y3[] = {
  NSPAIR(_ZN7G19x7y3C1Ev),
  NSPAIR(_ZN7G19x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G19x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y3[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G19x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G19x7y3[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G19x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G19x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G19x7y3[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y3[] = {
  {&(_ZTV7G19x7y3[7]),  7,25},
  {&(_ZTV7G19x7y3[12]),  12,25},
  {&(_ZTV7G19x7y3[16]),  16,25},
  {&(_ZTV7G19x7y3[20]),  20,25},
  {&(_ZTV7G19x7y3[24]),  24,25},
  {&(_tg__ZTV5E19x7__7G19x7y3[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y3[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y3[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x7y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y3[];
extern  VTBL_ENTRY _ZTV7G19x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y3[];
static VTBL_ENTRY alt_thunk_names201[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y3 = {  "G19x7y3", // class name
  bases_G19x7y3, 6,
  &(vtc_G19x7y3[0]), // expected_vtbl_contents
  &(vtt_G19x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G19x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names201,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y4  : E19x7 , F0 {
  int ff;
  ~G19x7y4(); // tgen
  G19x7y4(); // tgen
};
//SIG(1 G19x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G19x7y4 ::~G19x7y4(){ note_dtor("G19x7y4", this);} // tgen
G19x7y4 ::G19x7y4(){ note_ctor("G19x7y4", this);} // tgen

static void Test_G19x7y4()
{
  extern Class_Descriptor cd_G19x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x7y4, buf);
    G19x7y4 *dp, &lv = *(dp=new (buf) G19x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y4)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(40,28), "G19x7y4");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(32,20), "G19x7y4");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(24,16), "G19x7y4");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(52,36), "G19x7y4");
    check_base_class_offset(lv, (E19x7*), 0, "G19x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G19x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G19x7y4.ff");
    test_class_info(&lv, &cd_G19x7y4);
    dp->~G19x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y4(Test_G19x7y4, "G19x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x7y4C1Ev();
extern void _ZN7G19x7y4D1Ev();
Name_Map name_map_G19x7y4[] = {
  NSPAIR(_ZN7G19x7y4C1Ev),
  NSPAIR(_ZN7G19x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y4[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G19x7y4[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G19x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x7y4[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y4[] = {
  {&(_ZTV7G19x7y4[5]),  5,14},
  {&(_tg__ZTV5E19x7__7G19x7y4[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y4[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y4[3]),  3,4},
  {&(_ZTV7G19x7y4[9]),  9,14},
  {&(_ZTV7G19x7y4[13]),  13,14},
  {&(_tg__ZTV3C19__7G19x7y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y4[];
extern  VTBL_ENTRY _ZTV7G19x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y4[];
static VTBL_ENTRY alt_thunk_names202[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y4 = {  "G19x7y4", // class name
  bases_G19x7y4, 6,
  &(vtc_G19x7y4[0]), // expected_vtbl_contents
  &(vtt_G19x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names202,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y5  : virtual E19x7 , F0 {
  int ff;
  ~G19x7y5(); // tgen
  G19x7y5(); // tgen
};
//SIG(1 G19x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G19x7y5 ::~G19x7y5(){ note_dtor("G19x7y5", this);} // tgen
G19x7y5 ::G19x7y5(){ note_ctor("G19x7y5", this);} // tgen

static void Test_G19x7y5()
{
  extern Class_Descriptor cd_G19x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G19x7y5, buf);
    G19x7y5 *dp, &lv = *(dp=new (buf) G19x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G19x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y5)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,32), "G19x7y5");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,24), "G19x7y5");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(32,20), "G19x7y5");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(60,40), "G19x7y5");
    check_base_class_offset(lv, (E19x7*), ABISELECT(16,12), "G19x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G19x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x7y5.ff");
    test_class_info(&lv, &cd_G19x7y5);
    dp->~G19x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y5(Test_G19x7y5, "G19x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G19x7y5C1Ev();
extern void _ZN7G19x7y5D1Ev();
Name_Map name_map_G19x7y5[] = {
  NSPAIR(_ZN7G19x7y5C1Ev),
  NSPAIR(_ZN7G19x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y5[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G19x7y5[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G19x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x7y5[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y5[] = {
  {&(_ZTV7G19x7y5[6]),  6,20},
  {&(_ZTV7G19x7y5[11]),  11,20},
  {&(_ZTV7G19x7y5[15]),  15,20},
  {&(_ZTV7G19x7y5[19]),  19,20},
  {&(_tg__ZTV5E19x7__7G19x7y5[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y5[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y5[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x7y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y5[];
extern  VTBL_ENTRY _ZTV7G19x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y5[];
static VTBL_ENTRY alt_thunk_names203[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y5 = {  "G19x7y5", // class name
  bases_G19x7y5, 6,
  &(vtc_G19x7y5[0]), // expected_vtbl_contents
  &(vtt_G19x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G19x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names203,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y6  : E19x7 , virtual F0 {
  int ff;
  ~G19x7y6(); // tgen
  G19x7y6(); // tgen
};
//SIG(1 G19x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x7y6 ::~G19x7y6(){ note_dtor("G19x7y6", this);} // tgen
G19x7y6 ::G19x7y6(){ note_ctor("G19x7y6", this);} // tgen

static void Test_G19x7y6()
{
  extern Class_Descriptor cd_G19x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G19x7y6, buf);
    G19x7y6 *dp, &lv = *(dp=new (buf) G19x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G19x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y6)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(32,24), "G19x7y6");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(24,16), "G19x7y6");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(16,12), "G19x7y6");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(44,32), "G19x7y6");
    check_base_class_offset(lv, (E19x7*), 0, "G19x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G19x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G19x7y6.ff");
    test_class_info(&lv, &cd_G19x7y6);
    dp->~G19x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y6(Test_G19x7y6, "G19x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G19x7y6C1Ev();
extern void _ZN7G19x7y6D1Ev();
Name_Map name_map_G19x7y6[] = {
  NSPAIR(_ZN7G19x7y6C1Ev),
  NSPAIR(_ZN7G19x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y6[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G19x7y6[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G19x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x7y6[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y6[] = {
  {&(_ZTV7G19x7y6[6]),  6,15},
  {&(_tg__ZTV5E19x7__7G19x7y6[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y6[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y6[3]),  3,4},
  {&(_ZTV7G19x7y6[10]),  10,15},
  {&(_ZTV7G19x7y6[14]),  14,15},
  {&(_tg__ZTV3C19__7G19x7y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y6[];
extern  VTBL_ENTRY _ZTV7G19x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y6[];
static VTBL_ENTRY alt_thunk_names204[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y6 = {  "G19x7y6", // class name
  bases_G19x7y6, 6,
  &(vtc_G19x7y6[0]), // expected_vtbl_contents
  &(vtt_G19x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G19x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names204,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G19x7y7  : virtual E19x7 , virtual F0 {
  int ff;
  ~G19x7y7(); // tgen
  G19x7y7(); // tgen
};
//SIG(1 G19x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G19x7y7 ::~G19x7y7(){ note_dtor("G19x7y7", this);} // tgen
G19x7y7 ::G19x7y7(){ note_ctor("G19x7y7", this);} // tgen

static void Test_G19x7y7()
{
  extern Class_Descriptor cd_G19x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G19x7y7, buf);
    G19x7y7 *dp, &lv = *(dp=new (buf) G19x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G19x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G19x7y7)");
    check_base_class_offset(lv, (A1*)(C19*), ABISELECT(48,28), "G19x7y7");
    check_base_class_offset(lv, (B0*)(C19*), ABISELECT(40,20), "G19x7y7");
    check_base_class_offset(lv, (C19*)(E19x7*), ABISELECT(32,16), "G19x7y7");
    check_base_class_offset(lv, (D0*)(E19x7*), ABISELECT(60,36), "G19x7y7");
    check_base_class_offset(lv, (E19x7*), ABISELECT(16,8), "G19x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G19x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G19x7y7.ff");
    test_class_info(&lv, &cd_G19x7y7);
    dp->~G19x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG19x7y7(Test_G19x7y7, "G19x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G19x7y7C1Ev();
extern void _ZN7G19x7y7D1Ev();
Name_Map name_map_G19x7y7[] = {
  NSPAIR(_ZN7G19x7y7C1Ev),
  NSPAIR(_ZN7G19x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C19;
extern VTBL_ENTRY _ZTI3C19[];
extern  VTBL_ENTRY _ZTV3C19[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C19[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E19x7;
extern VTBL_ENTRY _ZTI5E19x7[];
extern  VTBL_ENTRY _ZTV5E19x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E19x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G19x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C19,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E19x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G19x7y7[];
extern void _ZN3C193fooEv();
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G19x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G19x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G19x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G19x7y7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G19x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern VTBL_ENTRY _ZTV7G19x7y7[];
static  VTBL_ENTRY _tg__ZTV5E19x7__7G19x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__5E19x7__7G19x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E19x7__7G19x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E19x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
extern void _ZN3C193fooEv();
static  VTBL_ENTRY _tg__ZTV3C19__7G19x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&_ZN3C193fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv)();
extern void ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C19__7G19x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C19[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv),
};
static  VTT_ENTRY vtt_G19x7y7[] = {
  {&(_ZTV7G19x7y7[7]),  7,21},
  {&(_ZTV7G19x7y7[12]),  12,21},
  {&(_ZTV7G19x7y7[16]),  16,21},
  {&(_ZTV7G19x7y7[20]),  20,21},
  {&(_tg__ZTV5E19x7__7G19x7y7[5]),  5,5},
  {&(_tg__ZTV3C19__5E19x7__7G19x7y7[4]),  4,5},
  {&(_tg__ZTV2A1__5E19x7__7G19x7y7[3]),  3,4},
  {&(_tg__ZTV3C19__7G19x7y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C19__7G19x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G19x7y7[];
extern  VTBL_ENTRY _ZTV7G19x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G19x7y7[];
static VTBL_ENTRY alt_thunk_names205[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C193fooEv,_ZTv0_n12_N3C193fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C193fooEv,_ZThn12_N3C193fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G19x7y7 = {  "G19x7y7", // class name
  bases_G19x7y7, 6,
  &(vtc_G19x7y7[0]), // expected_vtbl_contents
  &(vtt_G19x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G19x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G19x7y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G19x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names205,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E20x7  : virtual C20 , virtual D0 {
  int fd;
  ~E20x7(); // tgen
  E20x7(); // tgen
};
//SIG(-1 E20x7) C1{ VBC2{ BC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E20x7 ::~E20x7(){ note_dtor("E20x7", this);} // tgen
E20x7 ::E20x7(){ note_ctor("E20x7", this);} // tgen

static void Test_E20x7()
{
  extern Class_Descriptor cd_E20x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E20x7, buf);
    E20x7 *dp, &lv = *(dp=new (buf) E20x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E20x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E20x7)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,16), "E20x7");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,8), "E20x7");
    check_base_class_offset(lv, (C20*), ABISELECT(16,8), "E20x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E20x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E20x7.fd");
    test_class_info(&lv, &cd_E20x7);
    dp->~E20x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE20x7(Test_E20x7, "E20x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E20x7C1Ev();
extern void _ZN5E20x7D1Ev();
Name_Map name_map_E20x7[] = {
  NSPAIR(_ZN5E20x7C1Ev),
  NSPAIR(_ZN5E20x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E20x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E20x7[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_E20x7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV5E20x7[];
static  VTT_ENTRY vtt_E20x7[] = {
  {&(_ZTV5E20x7[4]),  4,8},
  {&(_ZTV5E20x7[7]),  7,8},
};
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
Class_Descriptor cd_E20x7 = {  "E20x7", // class name
  bases_E20x7, 4,
  &(vtc_E20x7[0]), // expected_vtbl_contents
  &(vtt_E20x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E20x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E20x7),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E20x7),2, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y0  : E20x7 , F1 {
  int ff;
  ~G20x7y0(); // tgen
  G20x7y0(); // tgen
};
//SIG(1 G20x7y0) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x7y0 ::~G20x7y0(){ note_dtor("G20x7y0", this);} // tgen
G20x7y0 ::G20x7y0(){ note_ctor("G20x7y0", this);} // tgen

static void Test_G20x7y0()
{
  extern Class_Descriptor cd_G20x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x7y0, buf);
    G20x7y0 *dp, &lv = *(dp=new (buf) G20x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y0)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x7y0");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x7y0");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(32,20), "G20x7y0");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(52,36), "G20x7y0");
    check_base_class_offset(lv, (E20x7*), 0, "G20x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G20x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G20x7y0.ff");
    test_class_info(&lv, &cd_G20x7y0);
    dp->~G20x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y0(Test_G20x7y0, "G20x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x7y0C1Ev();
extern void _ZN7G20x7y0D1Ev();
Name_Map name_map_G20x7y0[] = {
  NSPAIR(_ZN7G20x7y0C1Ev),
  NSPAIR(_ZN7G20x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G20x7y0[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y0[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y0[] = {
  {&(_ZTV7G20x7y0[4]),  4,11},
  {&(_tg__ZTV5E20x7__7G20x7y0[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y0[3]),  3,4},
  {&(_ZTV7G20x7y0[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G20x7y0[];
extern  VTBL_ENTRY _ZTV7G20x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y0[];
Class_Descriptor cd_G20x7y0 = {  "G20x7y0", // class name
  bases_G20x7y0, 6,
  &(vtc_G20x7y0[0]), // expected_vtbl_contents
  &(vtt_G20x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y0),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y0),4, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y1  : virtual E20x7 , F1 {
  int ff;
  ~G20x7y1(); // tgen
  G20x7y1(); // tgen
};
//SIG(1 G20x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G20x7y1 ::~G20x7y1(){ note_dtor("G20x7y1", this);} // tgen
G20x7y1 ::G20x7y1(){ note_ctor("G20x7y1", this);} // tgen

static void Test_G20x7y1()
{
  extern Class_Descriptor cd_G20x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x7y1, buf);
    G20x7y1 *dp, &lv = *(dp=new (buf) G20x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y1)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x7y1");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x7y1");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(32,20), "G20x7y1");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(52,36), "G20x7y1");
    check_base_class_offset(lv, (E20x7*), ABISELECT(16,12), "G20x7y1");
    check_base_class_offset(lv, (F1*), 0, "G20x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x7y1.ff");
    test_class_info(&lv, &cd_G20x7y1);
    dp->~G20x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y1(Test_G20x7y1, "G20x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x7y1C1Ev();
extern void _ZN7G20x7y1D1Ev();
Name_Map name_map_G20x7y1[] = {
  NSPAIR(_ZN7G20x7y1C1Ev),
  NSPAIR(_ZN7G20x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G20x7y1[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y1[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y1[] = {
  {&(_ZTV7G20x7y1[5]),  5,14},
  {&(_ZTV7G20x7y1[10]),  10,14},
  {&(_ZTV7G20x7y1[13]),  13,14},
  {&(_tg__ZTV5E20x7__7G20x7y1[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x7y1[];
extern  VTBL_ENTRY _ZTV7G20x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y1[];
Class_Descriptor cd_G20x7y1 = {  "G20x7y1", // class name
  bases_G20x7y1, 6,
  &(vtc_G20x7y1[0]), // expected_vtbl_contents
  &(vtt_G20x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y1),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y1),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y2  : E20x7 , virtual F1 {
  int ff;
  ~G20x7y2(); // tgen
  G20x7y2(); // tgen
};
//SIG(1 G20x7y2) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x7y2 ::~G20x7y2(){ note_dtor("G20x7y2", this);} // tgen
G20x7y2 ::G20x7y2(){ note_ctor("G20x7y2", this);} // tgen

static void Test_G20x7y2()
{
  extern Class_Descriptor cd_G20x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x7y2, buf);
    G20x7y2 *dp, &lv = *(dp=new (buf) G20x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y2)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,20), "G20x7y2");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,12), "G20x7y2");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(16,12), "G20x7y2");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(36,28), "G20x7y2");
    check_base_class_offset(lv, (E20x7*), 0, "G20x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G20x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x7y2.ff");
    test_class_info(&lv, &cd_G20x7y2);
    dp->~G20x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y2(Test_G20x7y2, "G20x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x7y2C1Ev();
extern void _ZN7G20x7y2D1Ev();
Name_Map name_map_G20x7y2[] = {
  NSPAIR(_ZN7G20x7y2C1Ev),
  NSPAIR(_ZN7G20x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y2[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x7y2[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G20x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y2[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y2[] = {
  {&(_ZTV7G20x7y2[5]),  5,13},
  {&(_tg__ZTV5E20x7__7G20x7y2[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y2[3]),  3,4},
  {&(_ZTV7G20x7y2[8]),  8,13},
  {&(_ZTV7G20x7y2[12]),  12,13},
};
extern VTBL_ENTRY _ZTI7G20x7y2[];
extern  VTBL_ENTRY _ZTV7G20x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y2[];
Class_Descriptor cd_G20x7y2 = {  "G20x7y2", // class name
  bases_G20x7y2, 6,
  &(vtc_G20x7y2[0]), // expected_vtbl_contents
  &(vtt_G20x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y2),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y2),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y3  : virtual E20x7 , virtual F1 {
  int ff;
  ~G20x7y3(); // tgen
  G20x7y3(); // tgen
};
//SIG(1 G20x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G20x7y3 ::~G20x7y3(){ note_dtor("G20x7y3", this);} // tgen
G20x7y3 ::G20x7y3(){ note_ctor("G20x7y3", this);} // tgen

static void Test_G20x7y3()
{
  extern Class_Descriptor cd_G20x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G20x7y3, buf);
    G20x7y3 *dp, &lv = *(dp=new (buf) G20x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G20x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y3)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,24), "G20x7y3");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,16), "G20x7y3");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(32,16), "G20x7y3");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(52,32), "G20x7y3");
    check_base_class_offset(lv, (E20x7*), ABISELECT(16,8), "G20x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G20x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x7y3.ff");
    test_class_info(&lv, &cd_G20x7y3);
    dp->~G20x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y3(Test_G20x7y3, "G20x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G20x7y3C1Ev();
extern void _ZN7G20x7y3D1Ev();
Name_Map name_map_G20x7y3[] = {
  NSPAIR(_ZN7G20x7y3C1Ev),
  NSPAIR(_ZN7G20x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G20x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    14, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y3[];
extern void _ZN3C203fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G20x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G20x7y3[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G20x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y3[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y3[] = {
  {&(_ZTV7G20x7y3[6]),  6,18},
  {&(_ZTV7G20x7y3[10]),  10,18},
  {&(_ZTV7G20x7y3[13]),  13,18},
  {&(_ZTV7G20x7y3[17]),  17,18},
  {&(_tg__ZTV5E20x7__7G20x7y3[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x7y3[];
extern  VTBL_ENTRY _ZTV7G20x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y3[];
Class_Descriptor cd_G20x7y3 = {  "G20x7y3", // class name
  bases_G20x7y3, 6,
  &(vtc_G20x7y3[0]), // expected_vtbl_contents
  &(vtt_G20x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G20x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y3),18, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y3),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y4  : E20x7 , F0 {
  int ff;
  ~G20x7y4(); // tgen
  G20x7y4(); // tgen
};
//SIG(1 G20x7y4) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G20x7y4 ::~G20x7y4(){ note_dtor("G20x7y4", this);} // tgen
G20x7y4 ::G20x7y4(){ note_ctor("G20x7y4", this);} // tgen

static void Test_G20x7y4()
{
  extern Class_Descriptor cd_G20x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x7y4, buf);
    G20x7y4 *dp, &lv = *(dp=new (buf) G20x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y4)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(36,24), "G20x7y4");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(24,16), "G20x7y4");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(24,16), "G20x7y4");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(44,32), "G20x7y4");
    check_base_class_offset(lv, (E20x7*), 0, "G20x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G20x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G20x7y4.ff");
    test_class_info(&lv, &cd_G20x7y4);
    dp->~G20x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y4(Test_G20x7y4, "G20x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x7y4C1Ev();
extern void _ZN7G20x7y4D1Ev();
Name_Map name_map_G20x7y4[] = {
  NSPAIR(_ZN7G20x7y4C1Ev),
  NSPAIR(_ZN7G20x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y4[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G20x7y4[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y4[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y4[] = {
  {&(_ZTV7G20x7y4[4]),  4,8},
  {&(_tg__ZTV5E20x7__7G20x7y4[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y4[3]),  3,4},
  {&(_ZTV7G20x7y4[7]),  7,8},
};
extern VTBL_ENTRY _ZTI7G20x7y4[];
extern  VTBL_ENTRY _ZTV7G20x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y4[];
Class_Descriptor cd_G20x7y4 = {  "G20x7y4", // class name
  bases_G20x7y4, 6,
  &(vtc_G20x7y4[0]), // expected_vtbl_contents
  &(vtt_G20x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y4),8, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y4),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y5  : virtual E20x7 , F0 {
  int ff;
  ~G20x7y5(); // tgen
  G20x7y5(); // tgen
};
//SIG(1 G20x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G20x7y5 ::~G20x7y5(){ note_dtor("G20x7y5", this);} // tgen
G20x7y5 ::G20x7y5(){ note_ctor("G20x7y5", this);} // tgen

static void Test_G20x7y5()
{
  extern Class_Descriptor cd_G20x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G20x7y5, buf);
    G20x7y5 *dp, &lv = *(dp=new (buf) G20x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G20x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y5)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,28), "G20x7y5");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,20), "G20x7y5");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(32,20), "G20x7y5");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(52,36), "G20x7y5");
    check_base_class_offset(lv, (E20x7*), ABISELECT(16,12), "G20x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G20x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x7y5.ff");
    test_class_info(&lv, &cd_G20x7y5);
    dp->~G20x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y5(Test_G20x7y5, "G20x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G20x7y5C1Ev();
extern void _ZN7G20x7y5D1Ev();
Name_Map name_map_G20x7y5[] = {
  NSPAIR(_ZN7G20x7y5C1Ev),
  NSPAIR(_ZN7G20x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y5[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G20x7y5[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y5[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y5[] = {
  {&(_ZTV7G20x7y5[5]),  5,13},
  {&(_ZTV7G20x7y5[9]),  9,13},
  {&(_ZTV7G20x7y5[12]),  12,13},
  {&(_tg__ZTV5E20x7__7G20x7y5[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x7y5[];
extern  VTBL_ENTRY _ZTV7G20x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y5[];
Class_Descriptor cd_G20x7y5 = {  "G20x7y5", // class name
  bases_G20x7y5, 6,
  &(vtc_G20x7y5[0]), // expected_vtbl_contents
  &(vtt_G20x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G20x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y5),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y5),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y6  : E20x7 , virtual F0 {
  int ff;
  ~G20x7y6(); // tgen
  G20x7y6(); // tgen
};
//SIG(1 G20x7y6) C1{ BC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x7y6 ::~G20x7y6(){ note_dtor("G20x7y6", this);} // tgen
G20x7y6 ::G20x7y6(){ note_ctor("G20x7y6", this);} // tgen

static void Test_G20x7y6()
{
  extern Class_Descriptor cd_G20x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G20x7y6, buf);
    G20x7y6 *dp, &lv = *(dp=new (buf) G20x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G20x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y6)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(28,20), "G20x7y6");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(16,12), "G20x7y6");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(16,12), "G20x7y6");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(36,28), "G20x7y6");
    check_base_class_offset(lv, (E20x7*), 0, "G20x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G20x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G20x7y6.ff");
    test_class_info(&lv, &cd_G20x7y6);
    dp->~G20x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y6(Test_G20x7y6, "G20x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G20x7y6C1Ev();
extern void _ZN7G20x7y6D1Ev();
Name_Map name_map_G20x7y6[] = {
  NSPAIR(_ZN7G20x7y6C1Ev),
  NSPAIR(_ZN7G20x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y6[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G20x7y6[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y6[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y6[] = {
  {&(_ZTV7G20x7y6[5]),  5,9},
  {&(_tg__ZTV5E20x7__7G20x7y6[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y6[3]),  3,4},
  {&(_ZTV7G20x7y6[8]),  8,9},
};
extern VTBL_ENTRY _ZTI7G20x7y6[];
extern  VTBL_ENTRY _ZTV7G20x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y6[];
Class_Descriptor cd_G20x7y6 = {  "G20x7y6", // class name
  bases_G20x7y6, 6,
  &(vtc_G20x7y6[0]), // expected_vtbl_contents
  &(vtt_G20x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G20x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y6),9, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y6),4, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G20x7y7  : virtual E20x7 , virtual F0 {
  int ff;
  ~G20x7y7(); // tgen
  G20x7y7(); // tgen
};
//SIG(1 G20x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G20x7y7 ::~G20x7y7(){ note_dtor("G20x7y7", this);} // tgen
G20x7y7 ::G20x7y7(){ note_ctor("G20x7y7", this);} // tgen

static void Test_G20x7y7()
{
  extern Class_Descriptor cd_G20x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G20x7y7, buf);
    G20x7y7 *dp, &lv = *(dp=new (buf) G20x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G20x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G20x7y7)");
    check_base_class_offset(lv, (A0*)(C20*), ABISELECT(44,24), "G20x7y7");
    check_base_class_offset(lv, (B1*)(C20*), ABISELECT(32,16), "G20x7y7");
    check_base_class_offset(lv, (C20*)(E20x7*), ABISELECT(32,16), "G20x7y7");
    check_base_class_offset(lv, (D0*)(E20x7*), ABISELECT(52,32), "G20x7y7");
    check_base_class_offset(lv, (E20x7*), ABISELECT(16,8), "G20x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G20x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G20x7y7.ff");
    test_class_info(&lv, &cd_G20x7y7);
    dp->~G20x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG20x7y7(Test_G20x7y7, "G20x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G20x7y7C1Ev();
extern void _ZN7G20x7y7D1Ev();
Name_Map name_map_G20x7y7[] = {
  NSPAIR(_ZN7G20x7y7C1Ev),
  NSPAIR(_ZN7G20x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C20;
extern VTBL_ENTRY _ZTI3C20[];
extern  VTBL_ENTRY _ZTV3C20[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E20x7;
extern VTBL_ENTRY _ZTI5E20x7[];
extern  VTBL_ENTRY _ZTV5E20x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E20x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G20x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C20,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E20x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G20x7y7[];
extern void _ZN3C203fooEv();
static  VTBL_ENTRY vtc_G20x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G20x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G20x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G20x7y7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
extern VTBL_ENTRY _ZTV7G20x7y7[];
static  VTBL_ENTRY _tg__ZTV5E20x7__7G20x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
};
extern void _ZN3C203fooEv();
static  VTBL_ENTRY _tg__ZTV3C20__5E20x7__7G20x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E20x7[0]),
  (VTBL_ENTRY)&_ZN3C203fooEv,
};
static  VTT_ENTRY vtt_G20x7y7[] = {
  {&(_ZTV7G20x7y7[6]),  6,14},
  {&(_ZTV7G20x7y7[10]),  10,14},
  {&(_ZTV7G20x7y7[13]),  13,14},
  {&(_tg__ZTV5E20x7__7G20x7y7[4]),  4,4},
  {&(_tg__ZTV3C20__5E20x7__7G20x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G20x7y7[];
extern  VTBL_ENTRY _ZTV7G20x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G20x7y7[];
Class_Descriptor cd_G20x7y7 = {  "G20x7y7", // class name
  bases_G20x7y7, 6,
  &(vtc_G20x7y7[0]), // expected_vtbl_contents
  &(vtt_G20x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G20x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G20x7y7),14, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G20x7y7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E21x7  : virtual C21 , virtual D0 {
  int fd;
  ~E21x7(); // tgen
  E21x7(); // tgen
};
//SIG(-1 E21x7) C1{ VBC2{ BC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E21x7 ::~E21x7(){ note_dtor("E21x7", this);} // tgen
E21x7 ::E21x7(){ note_ctor("E21x7", this);} // tgen

static void Test_E21x7()
{
  extern Class_Descriptor cd_E21x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E21x7, buf);
    E21x7 *dp, &lv = *(dp=new (buf) E21x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E21x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E21x7)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,8), "E21x7");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,16), "E21x7");
    check_base_class_offset(lv, (C21*), ABISELECT(16,8), "E21x7");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E21x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E21x7.fd");
    test_class_info(&lv, &cd_E21x7);
    dp->~E21x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE21x7(Test_E21x7, "E21x7", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN5E21x7C1Ev();
extern void _ZN5E21x7D1Ev();
Name_Map name_map_E21x7[] = {
  NSPAIR(_ZN5E21x7C1Ev),
  NSPAIR(_ZN5E21x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E21x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E21x7[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_E21x7[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV5E21x7[];
static  VTT_ENTRY vtt_E21x7[] = {
  {&(_ZTV5E21x7[4]),  4,11},
  {&(_ZTV5E21x7[7]),  7,11},
  {&(_ZTV5E21x7[10]),  10,11},
};
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
Class_Descriptor cd_E21x7 = {  "E21x7", // class name
  bases_E21x7, 4,
  &(vtc_E21x7[0]), // expected_vtbl_contents
  &(vtt_E21x7[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI5E21x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E21x7),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E21x7),3, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y0  : E21x7 , F1 {
  int ff;
  ~G21x7y0(); // tgen
  G21x7y0(); // tgen
};
//SIG(1 G21x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x7y0 ::~G21x7y0(){ note_dtor("G21x7y0", this);} // tgen
G21x7y0 ::G21x7y0(){ note_ctor("G21x7y0", this);} // tgen

static void Test_G21x7y0()
{
  extern Class_Descriptor cd_G21x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x7y0, buf);
    G21x7y0 *dp, &lv = *(dp=new (buf) G21x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y0)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x7y0");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x7y0");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(32,20), "G21x7y0");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(64,40), "G21x7y0");
    check_base_class_offset(lv, (E21x7*), 0, "G21x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G21x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G21x7y0.ff");
    test_class_info(&lv, &cd_G21x7y0);
    dp->~G21x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y0(Test_G21x7y0, "G21x7y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x7y0C1Ev();
extern void _ZN7G21x7y0D1Ev();
Name_Map name_map_G21x7y0[] = {
  NSPAIR(_ZN7G21x7y0C1Ev),
  NSPAIR(_ZN7G21x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    11, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,20), //bcp->offset
    7, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    4, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x7y0[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G21x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x7y0[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y0[] = {
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y0[] = {
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y0[] = {
  {&(_ZTV7G21x7y0[4]),  4,14},
  {&(_tg__ZTV5E21x7__7G21x7y0[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y0[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y0[2]),  2,3},
  {&(_ZTV7G21x7y0[10]),  10,14},
  {&(_ZTV7G21x7y0[13]),  13,14},
};
extern VTBL_ENTRY _ZTI7G21x7y0[];
extern  VTBL_ENTRY _ZTV7G21x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y0[];
Class_Descriptor cd_G21x7y0 = {  "G21x7y0", // class name
  bases_G21x7y0, 6,
  &(vtc_G21x7y0[0]), // expected_vtbl_contents
  &(vtt_G21x7y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y0),14, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y0),6, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y1  : virtual E21x7 , F1 {
  int ff;
  ~G21x7y1(); // tgen
  G21x7y1(); // tgen
};
//SIG(1 G21x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G21x7y1 ::~G21x7y1(){ note_dtor("G21x7y1", this);} // tgen
G21x7y1 ::G21x7y1(){ note_ctor("G21x7y1", this);} // tgen

static void Test_G21x7y1()
{
  extern Class_Descriptor cd_G21x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x7y1, buf);
    G21x7y1 *dp, &lv = *(dp=new (buf) G21x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y1)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x7y1");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x7y1");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(32,20), "G21x7y1");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(64,40), "G21x7y1");
    check_base_class_offset(lv, (E21x7*), ABISELECT(16,12), "G21x7y1");
    check_base_class_offset(lv, (F1*), 0, "G21x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x7y1.ff");
    test_class_info(&lv, &cd_G21x7y1);
    dp->~G21x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y1(Test_G21x7y1, "G21x7y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x7y1C1Ev();
extern void _ZN7G21x7y1D1Ev();
Name_Map name_map_G21x7y1[] = {
  NSPAIR(_ZN7G21x7y1C1Ev),
  NSPAIR(_ZN7G21x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    14, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x7y1[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x7y1[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x7y1[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G21x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x7y1[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y1[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y1[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y1[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y1[] = {
  {&(_ZTV7G21x7y1[5]),  5,17},
  {&(_ZTV7G21x7y1[10]),  10,17},
  {&(_ZTV7G21x7y1[13]),  13,17},
  {&(_ZTV7G21x7y1[16]),  16,17},
  {&(_tg__ZTV5E21x7__7G21x7y1[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y1[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y1[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x7y1[];
extern  VTBL_ENTRY _ZTV7G21x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y1[];
Class_Descriptor cd_G21x7y1 = {  "G21x7y1", // class name
  bases_G21x7y1, 6,
  &(vtc_G21x7y1[0]), // expected_vtbl_contents
  &(vtt_G21x7y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y1),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y1),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y2  : E21x7 , virtual F1 {
  int ff;
  ~G21x7y2(); // tgen
  G21x7y2(); // tgen
};
//SIG(1 G21x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x7y2 ::~G21x7y2(){ note_dtor("G21x7y2", this);} // tgen
G21x7y2 ::G21x7y2(){ note_ctor("G21x7y2", this);} // tgen

static void Test_G21x7y2()
{
  extern Class_Descriptor cd_G21x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x7y2, buf);
    G21x7y2 *dp, &lv = *(dp=new (buf) G21x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y2)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,12), "G21x7y2");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,20), "G21x7y2");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(16,12), "G21x7y2");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(48,32), "G21x7y2");
    check_base_class_offset(lv, (E21x7*), 0, "G21x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G21x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x7y2.ff");
    test_class_info(&lv, &cd_G21x7y2);
    dp->~G21x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y2(Test_G21x7y2, "G21x7y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x7y2C1Ev();
extern void _ZN7G21x7y2D1Ev();
Name_Map name_map_G21x7y2[] = {
  NSPAIR(_ZN7G21x7y2C1Ev),
  NSPAIR(_ZN7G21x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y2[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x7y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y2[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x7y2[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G21x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x7y2[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y2[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y2[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y2[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y2[] = {
  {&(_ZTV7G21x7y2[5]),  5,16},
  {&(_tg__ZTV5E21x7__7G21x7y2[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y2[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y2[2]),  2,3},
  {&(_ZTV7G21x7y2[8]),  8,16},
  {&(_ZTV7G21x7y2[11]),  11,16},
  {&(_ZTV7G21x7y2[15]),  15,16},
};
extern VTBL_ENTRY _ZTI7G21x7y2[];
extern  VTBL_ENTRY _ZTV7G21x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y2[];
Class_Descriptor cd_G21x7y2 = {  "G21x7y2", // class name
  bases_G21x7y2, 6,
  &(vtc_G21x7y2[0]), // expected_vtbl_contents
  &(vtt_G21x7y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y2),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y2),7, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y3  : virtual E21x7 , virtual F1 {
  int ff;
  ~G21x7y3(); // tgen
  G21x7y3(); // tgen
};
//SIG(1 G21x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G21x7y3 ::~G21x7y3(){ note_dtor("G21x7y3", this);} // tgen
G21x7y3 ::G21x7y3(){ note_ctor("G21x7y3", this);} // tgen

static void Test_G21x7y3()
{
  extern Class_Descriptor cd_G21x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G21x7y3, buf);
    G21x7y3 *dp, &lv = *(dp=new (buf) G21x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G21x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y3)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,16), "G21x7y3");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,24), "G21x7y3");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(32,16), "G21x7y3");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(64,36), "G21x7y3");
    check_base_class_offset(lv, (E21x7*), ABISELECT(16,8), "G21x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G21x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x7y3.ff");
    test_class_info(&lv, &cd_G21x7y3);
    dp->~G21x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y3(Test_G21x7y3, "G21x7y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G21x7y3C1Ev();
extern void _ZN7G21x7y3D1Ev();
Name_Map name_map_G21x7y3[] = {
  NSPAIR(_ZN7G21x7y3C1Ev),
  NSPAIR(_ZN7G21x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G21x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y3[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G21x7y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y3[0]),
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x7y3[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G21x7y3[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G21x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G21x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G21x7y3[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y3[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y3[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y3[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y3[] = {
  {&(_ZTV7G21x7y3[6]),  6,21},
  {&(_ZTV7G21x7y3[10]),  10,21},
  {&(_ZTV7G21x7y3[13]),  13,21},
  {&(_ZTV7G21x7y3[16]),  16,21},
  {&(_ZTV7G21x7y3[20]),  20,21},
  {&(_tg__ZTV5E21x7__7G21x7y3[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y3[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y3[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x7y3[];
extern  VTBL_ENTRY _ZTV7G21x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y3[];
Class_Descriptor cd_G21x7y3 = {  "G21x7y3", // class name
  bases_G21x7y3, 6,
  &(vtc_G21x7y3[0]), // expected_vtbl_contents
  &(vtt_G21x7y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G21x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y3),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y3),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y4  : E21x7 , F0 {
  int ff;
  ~G21x7y4(); // tgen
  G21x7y4(); // tgen
};
//SIG(1 G21x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G21x7y4 ::~G21x7y4(){ note_dtor("G21x7y4", this);} // tgen
G21x7y4 ::G21x7y4(){ note_ctor("G21x7y4", this);} // tgen

static void Test_G21x7y4()
{
  extern Class_Descriptor cd_G21x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G21x7y4, buf);
    G21x7y4 *dp, &lv = *(dp=new (buf) G21x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G21x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y4)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(24,16), "G21x7y4");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(40,24), "G21x7y4");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(24,16), "G21x7y4");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(56,36), "G21x7y4");
    check_base_class_offset(lv, (E21x7*), 0, "G21x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G21x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G21x7y4.ff");
    test_class_info(&lv, &cd_G21x7y4);
    dp->~G21x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y4(Test_G21x7y4, "G21x7y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G21x7y4C1Ev();
extern void _ZN7G21x7y4D1Ev();
Name_Map name_map_G21x7y4[] = {
  NSPAIR(_ZN7G21x7y4C1Ev),
  NSPAIR(_ZN7G21x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,24), //bcp->offset
    8, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(24,16), //bcp->offset
    4, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y4[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y4[0]),
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G21x7y4[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G21x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x7y4[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y4[] = {
  0,
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y4[] = {
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y4[] = {
  {&(_ZTV7G21x7y4[4]),  4,11},
  {&(_tg__ZTV5E21x7__7G21x7y4[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y4[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y4[2]),  2,3},
  {&(_ZTV7G21x7y4[7]),  7,11},
  {&(_ZTV7G21x7y4[10]),  10,11},
};
extern VTBL_ENTRY _ZTI7G21x7y4[];
extern  VTBL_ENTRY _ZTV7G21x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y4[];
Class_Descriptor cd_G21x7y4 = {  "G21x7y4", // class name
  bases_G21x7y4, 6,
  &(vtc_G21x7y4[0]), // expected_vtbl_contents
  &(vtt_G21x7y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G21x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y4),11, //virtual function table var
  4, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y4),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y5  : virtual E21x7 , F0 {
  int ff;
  ~G21x7y5(); // tgen
  G21x7y5(); // tgen
};
//SIG(1 G21x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G21x7y5 ::~G21x7y5(){ note_dtor("G21x7y5", this);} // tgen
G21x7y5 ::G21x7y5(){ note_ctor("G21x7y5", this);} // tgen

static void Test_G21x7y5()
{
  extern Class_Descriptor cd_G21x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x7y5, buf);
    G21x7y5 *dp, &lv = *(dp=new (buf) G21x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y5)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,20), "G21x7y5");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,28), "G21x7y5");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(32,20), "G21x7y5");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(64,40), "G21x7y5");
    check_base_class_offset(lv, (E21x7*), ABISELECT(16,12), "G21x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G21x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x7y5.ff");
    test_class_info(&lv, &cd_G21x7y5);
    dp->~G21x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y5(Test_G21x7y5, "G21x7y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x7y5C1Ev();
extern void _ZN7G21x7y5D1Ev();
Name_Map name_map_G21x7y5[] = {
  NSPAIR(_ZN7G21x7y5C1Ev),
  NSPAIR(_ZN7G21x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    13, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y5[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x7y5[] = {
  ABISELECT(64,40),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y5[0]),
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x7y5[0]),
  0,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x7y5[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G21x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x7y5[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y5[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y5[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y5[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y5[] = {
  {&(_ZTV7G21x7y5[5]),  5,16},
  {&(_ZTV7G21x7y5[9]),  9,16},
  {&(_ZTV7G21x7y5[12]),  12,16},
  {&(_ZTV7G21x7y5[15]),  15,16},
  {&(_tg__ZTV5E21x7__7G21x7y5[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y5[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y5[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x7y5[];
extern  VTBL_ENTRY _ZTV7G21x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y5[];
Class_Descriptor cd_G21x7y5 = {  "G21x7y5", // class name
  bases_G21x7y5, 6,
  &(vtc_G21x7y5[0]), // expected_vtbl_contents
  &(vtt_G21x7y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y5),16, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y5),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y6  : E21x7 , virtual F0 {
  int ff;
  ~G21x7y6(); // tgen
  G21x7y6(); // tgen
};
//SIG(1 G21x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x7y6 ::~G21x7y6(){ note_dtor("G21x7y6", this);} // tgen
G21x7y6 ::G21x7y6(){ note_ctor("G21x7y6", this);} // tgen

static void Test_G21x7y6()
{
  extern Class_Descriptor cd_G21x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G21x7y6, buf);
    G21x7y6 *dp, &lv = *(dp=new (buf) G21x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G21x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y6)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(16,12), "G21x7y6");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(32,20), "G21x7y6");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(16,12), "G21x7y6");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(48,32), "G21x7y6");
    check_base_class_offset(lv, (E21x7*), 0, "G21x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G21x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G21x7y6.ff");
    test_class_info(&lv, &cd_G21x7y6);
    dp->~G21x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y6(Test_G21x7y6, "G21x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G21x7y6C1Ev();
extern void _ZN7G21x7y6D1Ev();
Name_Map name_map_G21x7y6[] = {
  NSPAIR(_ZN7G21x7y6C1Ev),
  NSPAIR(_ZN7G21x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(16,12), //bcp->offset
    5, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y6[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x7y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y6[0]),
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G21x7y6[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G21x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x7y6[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y6[] = {
  ABISELECT(48,32),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y6[] = {
  0,
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y6[] = {
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y6[] = {
  {&(_ZTV7G21x7y6[5]),  5,12},
  {&(_tg__ZTV5E21x7__7G21x7y6[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y6[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y6[2]),  2,3},
  {&(_ZTV7G21x7y6[8]),  8,12},
  {&(_ZTV7G21x7y6[11]),  11,12},
};
extern VTBL_ENTRY _ZTI7G21x7y6[];
extern  VTBL_ENTRY _ZTV7G21x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y6[];
Class_Descriptor cd_G21x7y6 = {  "G21x7y6", // class name
  bases_G21x7y6, 6,
  &(vtc_G21x7y6[0]), // expected_vtbl_contents
  &(vtt_G21x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G21x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y6),12, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y6),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G21x7y7  : virtual E21x7 , virtual F0 {
  int ff;
  ~G21x7y7(); // tgen
  G21x7y7(); // tgen
};
//SIG(1 G21x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G21x7y7 ::~G21x7y7(){ note_dtor("G21x7y7", this);} // tgen
G21x7y7 ::G21x7y7(){ note_ctor("G21x7y7", this);} // tgen

static void Test_G21x7y7()
{
  extern Class_Descriptor cd_G21x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G21x7y7, buf);
    G21x7y7 *dp, &lv = *(dp=new (buf) G21x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G21x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G21x7y7)");
    check_base_class_offset(lv, (A1*)(C21*), ABISELECT(32,16), "G21x7y7");
    check_base_class_offset(lv, (B1*)(C21*), ABISELECT(48,24), "G21x7y7");
    check_base_class_offset(lv, (C21*)(E21x7*), ABISELECT(32,16), "G21x7y7");
    check_base_class_offset(lv, (D0*)(E21x7*), ABISELECT(64,36), "G21x7y7");
    check_base_class_offset(lv, (E21x7*), ABISELECT(16,8), "G21x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G21x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G21x7y7.ff");
    test_class_info(&lv, &cd_G21x7y7);
    dp->~G21x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG21x7y7(Test_G21x7y7, "G21x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G21x7y7C1Ev();
extern void _ZN7G21x7y7D1Ev();
Name_Map name_map_G21x7y7[] = {
  NSPAIR(_ZN7G21x7y7C1Ev),
  NSPAIR(_ZN7G21x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C21;
extern VTBL_ENTRY _ZTI3C21[];
extern  VTBL_ENTRY _ZTV3C21[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E21x7;
extern VTBL_ENTRY _ZTI5E21x7[];
extern  VTBL_ENTRY _ZTV5E21x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E21x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G21x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,24), //bcp->offset
    14, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C21,    ABISELECT(32,16), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E21x7,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G21x7y7[];
extern void _ZN3C213fooEv();
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY vtc_G21x7y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G21x7y7[0]),
  ABISELECT(48,28),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G21x7y7[0]),
  0,
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G21x7y7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G21x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
extern VTBL_ENTRY _ZTV7G21x7y7[];
static  VTBL_ENTRY _tg__ZTV5E21x7__7G21x7y7[] = {
  ABISELECT(48,28),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
};
extern void _ZN3C213fooEv();
static  VTBL_ENTRY _tg__ZTV3C21__5E21x7__7G21x7y7[] = {
  0,
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&_ZN3C213fooEv,
};
extern void ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv)();
static  VTBL_ENTRY _tg__ZTV2B13C21__5E21x7__7G21x7y7[] = {
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E21x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZThn16_N3C213fooEv,_ZThn8_N3C213fooEv),
};
static  VTT_ENTRY vtt_G21x7y7[] = {
  {&(_ZTV7G21x7y7[6]),  6,17},
  {&(_ZTV7G21x7y7[10]),  10,17},
  {&(_ZTV7G21x7y7[13]),  13,17},
  {&(_ZTV7G21x7y7[16]),  16,17},
  {&(_tg__ZTV5E21x7__7G21x7y7[4]),  4,4},
  {&(_tg__ZTV3C21__5E21x7__7G21x7y7[3]),  3,4},
  {&(_tg__ZTV2B13C21__5E21x7__7G21x7y7[2]),  2,3},
};
extern VTBL_ENTRY _ZTI7G21x7y7[];
extern  VTBL_ENTRY _ZTV7G21x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G21x7y7[];
Class_Descriptor cd_G21x7y7 = {  "G21x7y7", // class name
  bases_G21x7y7, 6,
  &(vtc_G21x7y7[0]), // expected_vtbl_contents
  &(vtt_G21x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G21x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G21x7y7),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G21x7y7),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E22x7  : virtual C22 , virtual D0 {
  int fd;
  ~E22x7(); // tgen
  E22x7(); // tgen
};
//SIG(-1 E22x7) C1{ VBC2{ VBC3{ Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E22x7 ::~E22x7(){ note_dtor("E22x7", this);} // tgen
E22x7 ::E22x7(){ note_ctor("E22x7", this);} // tgen

static void Test_E22x7()
{
  extern Class_Descriptor cd_E22x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E22x7, buf);
    E22x7 *dp, &lv = *(dp=new (buf) E22x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E22x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E22x7)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,20), "E22x7");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,8), "E22x7");
    check_base_class_offset(lv, (C22*), ABISELECT(16,8), "E22x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E22x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E22x7.fd");
    test_class_info(&lv, &cd_E22x7);
    dp->~E22x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE22x7(Test_E22x7, "E22x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E22x7C1Ev();
extern void _ZN5E22x7D1Ev();
Name_Map name_map_E22x7[] = {
  NSPAIR(_ZN5E22x7C1Ev),
  NSPAIR(_ZN5E22x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E22x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E22x7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_E22x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV5E22x7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_E22x7[] = {
  {&(_ZTV5E22x7[5]),  5,10},
  {&(_ZTV5E22x7[9]),  9,10},
  {&(_tg__ZTV3C22__5E22x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
Class_Descriptor cd_E22x7 = {  "E22x7", // class name
  bases_E22x7, 4,
  &(vtc_E22x7[0]), // expected_vtbl_contents
  &(vtt_E22x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E22x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E22x7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E22x7),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y0  : E22x7 , F1 {
  int ff;
  ~G22x7y0(); // tgen
  G22x7y0(); // tgen
};
//SIG(1 G22x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x7y0 ::~G22x7y0(){ note_dtor("G22x7y0", this);} // tgen
G22x7y0 ::G22x7y0(){ note_ctor("G22x7y0", this);} // tgen

static void Test_G22x7y0()
{
  extern Class_Descriptor cd_G22x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x7y0, buf);
    G22x7y0 *dp, &lv = *(dp=new (buf) G22x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y0)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x7y0");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x7y0");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(32,20), "G22x7y0");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(52,36), "G22x7y0");
    check_base_class_offset(lv, (E22x7*), 0, "G22x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G22x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G22x7y0.ff");
    test_class_info(&lv, &cd_G22x7y0);
    dp->~G22x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y0(Test_G22x7y0, "G22x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x7y0C1Ev();
extern void _ZN7G22x7y0D1Ev();
Name_Map name_map_G22x7y0[] = {
  NSPAIR(_ZN7G22x7y0C1Ev),
  NSPAIR(_ZN7G22x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G22x7y0[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y0[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y0[] = {
  {&(_ZTV7G22x7y0[5]),  5,13},
  {&(_tg__ZTV5E22x7__7G22x7y0[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y0[4]),  4,5},
  {&(_ZTV7G22x7y0[12]),  12,13},
  {&(_tg__ZTV3C22__7G22x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y0[];
extern  VTBL_ENTRY _ZTV7G22x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y0[];
Class_Descriptor cd_G22x7y0 = {  "G22x7y0", // class name
  bases_G22x7y0, 6,
  &(vtc_G22x7y0[0]), // expected_vtbl_contents
  &(vtt_G22x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y1  : virtual E22x7 , F1 {
  int ff;
  ~G22x7y1(); // tgen
  G22x7y1(); // tgen
};
//SIG(1 G22x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G22x7y1 ::~G22x7y1(){ note_dtor("G22x7y1", this);} // tgen
G22x7y1 ::G22x7y1(){ note_ctor("G22x7y1", this);} // tgen

static void Test_G22x7y1()
{
  extern Class_Descriptor cd_G22x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x7y1, buf);
    G22x7y1 *dp, &lv = *(dp=new (buf) G22x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y1)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x7y1");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x7y1");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(32,20), "G22x7y1");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(52,36), "G22x7y1");
    check_base_class_offset(lv, (E22x7*), ABISELECT(16,12), "G22x7y1");
    check_base_class_offset(lv, (F1*), 0, "G22x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x7y1.ff");
    test_class_info(&lv, &cd_G22x7y1);
    dp->~G22x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y1(Test_G22x7y1, "G22x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x7y1C1Ev();
extern void _ZN7G22x7y1D1Ev();
Name_Map name_map_G22x7y1[] = {
  NSPAIR(_ZN7G22x7y1C1Ev),
  NSPAIR(_ZN7G22x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G22x7y1[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y1[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y1[] = {
  {&(_ZTV7G22x7y1[6]),  6,17},
  {&(_ZTV7G22x7y1[12]),  12,17},
  {&(_ZTV7G22x7y1[16]),  16,17},
  {&(_tg__ZTV5E22x7__7G22x7y1[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y1[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y1[];
extern  VTBL_ENTRY _ZTV7G22x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y1[];
Class_Descriptor cd_G22x7y1 = {  "G22x7y1", // class name
  bases_G22x7y1, 6,
  &(vtc_G22x7y1[0]), // expected_vtbl_contents
  &(vtt_G22x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y2  : E22x7 , virtual F1 {
  int ff;
  ~G22x7y2(); // tgen
  G22x7y2(); // tgen
};
//SIG(1 G22x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x7y2 ::~G22x7y2(){ note_dtor("G22x7y2", this);} // tgen
G22x7y2 ::G22x7y2(){ note_ctor("G22x7y2", this);} // tgen

static void Test_G22x7y2()
{
  extern Class_Descriptor cd_G22x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x7y2, buf);
    G22x7y2 *dp, &lv = *(dp=new (buf) G22x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y2)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,24), "G22x7y2");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,12), "G22x7y2");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(16,12), "G22x7y2");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(36,28), "G22x7y2");
    check_base_class_offset(lv, (E22x7*), 0, "G22x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G22x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x7y2.ff");
    test_class_info(&lv, &cd_G22x7y2);
    dp->~G22x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y2(Test_G22x7y2, "G22x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x7y2C1Ev();
extern void _ZN7G22x7y2D1Ev();
Name_Map name_map_G22x7y2[] = {
  NSPAIR(_ZN7G22x7y2C1Ev),
  NSPAIR(_ZN7G22x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y2[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x7y2[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G22x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y2[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y2[] = {
  {&(_ZTV7G22x7y2[6]),  6,15},
  {&(_tg__ZTV5E22x7__7G22x7y2[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y2[4]),  4,5},
  {&(_ZTV7G22x7y2[10]),  10,15},
  {&(_ZTV7G22x7y2[14]),  14,15},
  {&(_tg__ZTV3C22__7G22x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y2[];
extern  VTBL_ENTRY _ZTV7G22x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y2[];
Class_Descriptor cd_G22x7y2 = {  "G22x7y2", // class name
  bases_G22x7y2, 6,
  &(vtc_G22x7y2[0]), // expected_vtbl_contents
  &(vtt_G22x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y3  : virtual E22x7 , virtual F1 {
  int ff;
  ~G22x7y3(); // tgen
  G22x7y3(); // tgen
};
//SIG(1 G22x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G22x7y3 ::~G22x7y3(){ note_dtor("G22x7y3", this);} // tgen
G22x7y3 ::G22x7y3(){ note_ctor("G22x7y3", this);} // tgen

static void Test_G22x7y3()
{
  extern Class_Descriptor cd_G22x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G22x7y3, buf);
    G22x7y3 *dp, &lv = *(dp=new (buf) G22x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G22x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y3)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,28), "G22x7y3");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,16), "G22x7y3");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(32,16), "G22x7y3");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(52,32), "G22x7y3");
    check_base_class_offset(lv, (E22x7*), ABISELECT(16,8), "G22x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G22x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x7y3.ff");
    test_class_info(&lv, &cd_G22x7y3);
    dp->~G22x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y3(Test_G22x7y3, "G22x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G22x7y3C1Ev();
extern void _ZN7G22x7y3D1Ev();
Name_Map name_map_G22x7y3[] = {
  NSPAIR(_ZN7G22x7y3C1Ev),
  NSPAIR(_ZN7G22x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G22x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y3[];
extern void _ZN3C223fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G22x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G22x7y3[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G22x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y3[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y3[] = {
  {&(_ZTV7G22x7y3[7]),  7,21},
  {&(_ZTV7G22x7y3[12]),  12,21},
  {&(_ZTV7G22x7y3[16]),  16,21},
  {&(_ZTV7G22x7y3[20]),  20,21},
  {&(_tg__ZTV5E22x7__7G22x7y3[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y3[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y3[];
extern  VTBL_ENTRY _ZTV7G22x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y3[];
Class_Descriptor cd_G22x7y3 = {  "G22x7y3", // class name
  bases_G22x7y3, 6,
  &(vtc_G22x7y3[0]), // expected_vtbl_contents
  &(vtt_G22x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G22x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y4  : E22x7 , F0 {
  int ff;
  ~G22x7y4(); // tgen
  G22x7y4(); // tgen
};
//SIG(1 G22x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G22x7y4 ::~G22x7y4(){ note_dtor("G22x7y4", this);} // tgen
G22x7y4 ::G22x7y4(){ note_ctor("G22x7y4", this);} // tgen

static void Test_G22x7y4()
{
  extern Class_Descriptor cd_G22x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x7y4, buf);
    G22x7y4 *dp, &lv = *(dp=new (buf) G22x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y4)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(40,28), "G22x7y4");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(24,16), "G22x7y4");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(24,16), "G22x7y4");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(44,32), "G22x7y4");
    check_base_class_offset(lv, (E22x7*), 0, "G22x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G22x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G22x7y4.ff");
    test_class_info(&lv, &cd_G22x7y4);
    dp->~G22x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y4(Test_G22x7y4, "G22x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x7y4C1Ev();
extern void _ZN7G22x7y4D1Ev();
Name_Map name_map_G22x7y4[] = {
  NSPAIR(_ZN7G22x7y4C1Ev),
  NSPAIR(_ZN7G22x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y4[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G22x7y4[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y4[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y4[] = {
  {&(_ZTV7G22x7y4[5]),  5,10},
  {&(_tg__ZTV5E22x7__7G22x7y4[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y4[4]),  4,5},
  {&(_ZTV7G22x7y4[9]),  9,10},
  {&(_tg__ZTV3C22__7G22x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y4[];
extern  VTBL_ENTRY _ZTV7G22x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y4[];
Class_Descriptor cd_G22x7y4 = {  "G22x7y4", // class name
  bases_G22x7y4, 6,
  &(vtc_G22x7y4[0]), // expected_vtbl_contents
  &(vtt_G22x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y5  : virtual E22x7 , F0 {
  int ff;
  ~G22x7y5(); // tgen
  G22x7y5(); // tgen
};
//SIG(1 G22x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G22x7y5 ::~G22x7y5(){ note_dtor("G22x7y5", this);} // tgen
G22x7y5 ::G22x7y5(){ note_ctor("G22x7y5", this);} // tgen

static void Test_G22x7y5()
{
  extern Class_Descriptor cd_G22x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G22x7y5, buf);
    G22x7y5 *dp, &lv = *(dp=new (buf) G22x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G22x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y5)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,32), "G22x7y5");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,20), "G22x7y5");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(32,20), "G22x7y5");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(52,36), "G22x7y5");
    check_base_class_offset(lv, (E22x7*), ABISELECT(16,12), "G22x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G22x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x7y5.ff");
    test_class_info(&lv, &cd_G22x7y5);
    dp->~G22x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y5(Test_G22x7y5, "G22x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G22x7y5C1Ev();
extern void _ZN7G22x7y5D1Ev();
Name_Map name_map_G22x7y5[] = {
  NSPAIR(_ZN7G22x7y5C1Ev),
  NSPAIR(_ZN7G22x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y5[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G22x7y5[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y5[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y5[] = {
  {&(_ZTV7G22x7y5[6]),  6,16},
  {&(_ZTV7G22x7y5[11]),  11,16},
  {&(_ZTV7G22x7y5[15]),  15,16},
  {&(_tg__ZTV5E22x7__7G22x7y5[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y5[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y5[];
extern  VTBL_ENTRY _ZTV7G22x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y5[];
Class_Descriptor cd_G22x7y5 = {  "G22x7y5", // class name
  bases_G22x7y5, 6,
  &(vtc_G22x7y5[0]), // expected_vtbl_contents
  &(vtt_G22x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G22x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y6  : E22x7 , virtual F0 {
  int ff;
  ~G22x7y6(); // tgen
  G22x7y6(); // tgen
};
//SIG(1 G22x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x7y6 ::~G22x7y6(){ note_dtor("G22x7y6", this);} // tgen
G22x7y6 ::G22x7y6(){ note_ctor("G22x7y6", this);} // tgen

static void Test_G22x7y6()
{
  extern Class_Descriptor cd_G22x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G22x7y6, buf);
    G22x7y6 *dp, &lv = *(dp=new (buf) G22x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G22x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y6)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(32,24), "G22x7y6");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(16,12), "G22x7y6");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(16,12), "G22x7y6");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(36,28), "G22x7y6");
    check_base_class_offset(lv, (E22x7*), 0, "G22x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G22x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G22x7y6.ff");
    test_class_info(&lv, &cd_G22x7y6);
    dp->~G22x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y6(Test_G22x7y6, "G22x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G22x7y6C1Ev();
extern void _ZN7G22x7y6D1Ev();
Name_Map name_map_G22x7y6[] = {
  NSPAIR(_ZN7G22x7y6C1Ev),
  NSPAIR(_ZN7G22x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y6[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G22x7y6[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y6[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y6[] = {
  {&(_ZTV7G22x7y6[6]),  6,11},
  {&(_tg__ZTV5E22x7__7G22x7y6[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y6[4]),  4,5},
  {&(_ZTV7G22x7y6[10]),  10,11},
  {&(_tg__ZTV3C22__7G22x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y6[];
extern  VTBL_ENTRY _ZTV7G22x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y6[];
Class_Descriptor cd_G22x7y6 = {  "G22x7y6", // class name
  bases_G22x7y6, 6,
  &(vtc_G22x7y6[0]), // expected_vtbl_contents
  &(vtt_G22x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G22x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G22x7y7  : virtual E22x7 , virtual F0 {
  int ff;
  ~G22x7y7(); // tgen
  G22x7y7(); // tgen
};
//SIG(1 G22x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G22x7y7 ::~G22x7y7(){ note_dtor("G22x7y7", this);} // tgen
G22x7y7 ::G22x7y7(){ note_ctor("G22x7y7", this);} // tgen

static void Test_G22x7y7()
{
  extern Class_Descriptor cd_G22x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G22x7y7, buf);
    G22x7y7 *dp, &lv = *(dp=new (buf) G22x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G22x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G22x7y7)");
    check_base_class_offset(lv, (A0*)(C22*), ABISELECT(48,28), "G22x7y7");
    check_base_class_offset(lv, (B1*)(C22*), ABISELECT(32,16), "G22x7y7");
    check_base_class_offset(lv, (C22*)(E22x7*), ABISELECT(32,16), "G22x7y7");
    check_base_class_offset(lv, (D0*)(E22x7*), ABISELECT(52,32), "G22x7y7");
    check_base_class_offset(lv, (E22x7*), ABISELECT(16,8), "G22x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G22x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G22x7y7.ff");
    test_class_info(&lv, &cd_G22x7y7);
    dp->~G22x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG22x7y7(Test_G22x7y7, "G22x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G22x7y7C1Ev();
extern void _ZN7G22x7y7D1Ev();
Name_Map name_map_G22x7y7[] = {
  NSPAIR(_ZN7G22x7y7C1Ev),
  NSPAIR(_ZN7G22x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C22;
extern VTBL_ENTRY _ZTI3C22[];
extern  VTBL_ENTRY _ZTV3C22[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C22[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E22x7;
extern VTBL_ENTRY _ZTI5E22x7[];
extern  VTBL_ENTRY _ZTV5E22x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E22x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G22x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C22,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E22x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G22x7y7[];
extern void _ZN3C223fooEv();
static  VTBL_ENTRY vtc_G22x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G22x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G22x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G22x7y7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern VTBL_ENTRY _ZTV7G22x7y7[];
static  VTBL_ENTRY _tg__ZTV5E22x7__7G22x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__5E22x7__7G22x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E22x7[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
extern void _ZN3C223fooEv();
static  VTBL_ENTRY _tg__ZTV3C22__7G22x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C22[0]),
  (VTBL_ENTRY)&_ZN3C223fooEv,
};
static  VTT_ENTRY vtt_G22x7y7[] = {
  {&(_ZTV7G22x7y7[7]),  7,17},
  {&(_ZTV7G22x7y7[12]),  12,17},
  {&(_ZTV7G22x7y7[16]),  16,17},
  {&(_tg__ZTV5E22x7__7G22x7y7[5]),  5,5},
  {&(_tg__ZTV3C22__5E22x7__7G22x7y7[4]),  4,5},
  {&(_tg__ZTV3C22__7G22x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G22x7y7[];
extern  VTBL_ENTRY _ZTV7G22x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G22x7y7[];
Class_Descriptor cd_G22x7y7 = {  "G22x7y7", // class name
  bases_G22x7y7, 6,
  &(vtc_G22x7y7[0]), // expected_vtbl_contents
  &(vtt_G22x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G22x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G22x7y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G22x7y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E23x7  : virtual C23 , virtual D0 {
  int fd;
  ~E23x7(); // tgen
  E23x7(); // tgen
};
//SIG(-1 E23x7) C1{ VBC2{ VBC3{ v1 Fi} BC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E23x7 ::~E23x7(){ note_dtor("E23x7", this);} // tgen
E23x7 ::E23x7(){ note_ctor("E23x7", this);} // tgen

static void Test_E23x7()
{
  extern Class_Descriptor cd_E23x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E23x7, buf);
    E23x7 *dp, &lv = *(dp=new (buf) E23x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E23x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E23x7)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,20), "E23x7");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,8), "E23x7");
    check_base_class_offset(lv, (C23*), ABISELECT(16,8), "E23x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E23x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E23x7.fd");
    test_class_info(&lv, &cd_E23x7);
    dp->~E23x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE23x7(Test_E23x7, "E23x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E23x7C1Ev();
extern void _ZN5E23x7D1Ev();
Name_Map name_map_E23x7[] = {
  NSPAIR(_ZN5E23x7C1Ev),
  NSPAIR(_ZN5E23x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E23x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E23x7[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E23x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV5E23x7[];
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__5E23x7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_E23x7[] = {
  {&(_ZTV5E23x7[5]),  5,14},
  {&(_ZTV5E23x7[9]),  9,14},
  {&(_ZTV5E23x7[13]),  13,14},
  {&(_tg__ZTV3C23__5E23x7[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__5E23x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
static VTBL_ENTRY alt_thunk_names206[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E23x7 = {  "E23x7", // class name
  bases_E23x7, 4,
  &(vtc_E23x7[0]), // expected_vtbl_contents
  &(vtt_E23x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E23x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E23x7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E23x7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names206,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y0  : E23x7 , F1 {
  int ff;
  ~G23x7y0(); // tgen
  G23x7y0(); // tgen
};
//SIG(1 G23x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x7y0 ::~G23x7y0(){ note_dtor("G23x7y0", this);} // tgen
G23x7y0 ::G23x7y0(){ note_ctor("G23x7y0", this);} // tgen

static void Test_G23x7y0()
{
  extern Class_Descriptor cd_G23x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x7y0, buf);
    G23x7y0 *dp, &lv = *(dp=new (buf) G23x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y0)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x7y0");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x7y0");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(32,20), "G23x7y0");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(60,40), "G23x7y0");
    check_base_class_offset(lv, (E23x7*), 0, "G23x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G23x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G23x7y0.ff");
    test_class_info(&lv, &cd_G23x7y0);
    dp->~G23x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y0(Test_G23x7y0, "G23x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x7y0C1Ev();
extern void _ZN7G23x7y0D1Ev();
Name_Map name_map_G23x7y0[] = {
  NSPAIR(_ZN7G23x7y0C1Ev),
  NSPAIR(_ZN7G23x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G23x7y0[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G23x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x7y0[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y0[] = {
  {&(_ZTV7G23x7y0[5]),  5,17},
  {&(_tg__ZTV5E23x7__7G23x7y0[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y0[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y0[3]),  3,4},
  {&(_ZTV7G23x7y0[12]),  12,17},
  {&(_ZTV7G23x7y0[16]),  16,17},
  {&(_tg__ZTV3C23__7G23x7y0[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y0[];
extern  VTBL_ENTRY _ZTV7G23x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y0[];
static VTBL_ENTRY alt_thunk_names207[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y0 = {  "G23x7y0", // class name
  bases_G23x7y0, 6,
  &(vtc_G23x7y0[0]), // expected_vtbl_contents
  &(vtt_G23x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names207,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y1  : virtual E23x7 , F1 {
  int ff;
  ~G23x7y1(); // tgen
  G23x7y1(); // tgen
};
//SIG(1 G23x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G23x7y1 ::~G23x7y1(){ note_dtor("G23x7y1", this);} // tgen
G23x7y1 ::G23x7y1(){ note_ctor("G23x7y1", this);} // tgen

static void Test_G23x7y1()
{
  extern Class_Descriptor cd_G23x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x7y1, buf);
    G23x7y1 *dp, &lv = *(dp=new (buf) G23x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y1)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x7y1");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x7y1");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(32,20), "G23x7y1");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(60,40), "G23x7y1");
    check_base_class_offset(lv, (E23x7*), ABISELECT(16,12), "G23x7y1");
    check_base_class_offset(lv, (F1*), 0, "G23x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x7y1.ff");
    test_class_info(&lv, &cd_G23x7y1);
    dp->~G23x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y1(Test_G23x7y1, "G23x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x7y1C1Ev();
extern void _ZN7G23x7y1D1Ev();
Name_Map name_map_G23x7y1[] = {
  NSPAIR(_ZN7G23x7y1C1Ev),
  NSPAIR(_ZN7G23x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G23x7y1[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G23x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x7y1[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y1[] = {
  {&(_ZTV7G23x7y1[6]),  6,21},
  {&(_ZTV7G23x7y1[12]),  12,21},
  {&(_ZTV7G23x7y1[16]),  16,21},
  {&(_ZTV7G23x7y1[20]),  20,21},
  {&(_tg__ZTV5E23x7__7G23x7y1[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y1[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y1[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x7y1[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y1[];
extern  VTBL_ENTRY _ZTV7G23x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y1[];
static VTBL_ENTRY alt_thunk_names208[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y1 = {  "G23x7y1", // class name
  bases_G23x7y1, 6,
  &(vtc_G23x7y1[0]), // expected_vtbl_contents
  &(vtt_G23x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names208,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y2  : E23x7 , virtual F1 {
  int ff;
  ~G23x7y2(); // tgen
  G23x7y2(); // tgen
};
//SIG(1 G23x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x7y2 ::~G23x7y2(){ note_dtor("G23x7y2", this);} // tgen
G23x7y2 ::G23x7y2(){ note_ctor("G23x7y2", this);} // tgen

static void Test_G23x7y2()
{
  extern Class_Descriptor cd_G23x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x7y2, buf);
    G23x7y2 *dp, &lv = *(dp=new (buf) G23x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y2)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,24), "G23x7y2");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,12), "G23x7y2");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(16,12), "G23x7y2");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(44,32), "G23x7y2");
    check_base_class_offset(lv, (E23x7*), 0, "G23x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G23x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x7y2.ff");
    test_class_info(&lv, &cd_G23x7y2);
    dp->~G23x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y2(Test_G23x7y2, "G23x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x7y2C1Ev();
extern void _ZN7G23x7y2D1Ev();
Name_Map name_map_G23x7y2[] = {
  NSPAIR(_ZN7G23x7y2C1Ev),
  NSPAIR(_ZN7G23x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y2[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x7y2[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G23x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x7y2[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y2[] = {
  {&(_ZTV7G23x7y2[6]),  6,19},
  {&(_tg__ZTV5E23x7__7G23x7y2[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y2[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y2[3]),  3,4},
  {&(_ZTV7G23x7y2[10]),  10,19},
  {&(_ZTV7G23x7y2[14]),  14,19},
  {&(_ZTV7G23x7y2[18]),  18,19},
  {&(_tg__ZTV3C23__7G23x7y2[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y2[];
extern  VTBL_ENTRY _ZTV7G23x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y2[];
static VTBL_ENTRY alt_thunk_names209[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y2 = {  "G23x7y2", // class name
  bases_G23x7y2, 6,
  &(vtc_G23x7y2[0]), // expected_vtbl_contents
  &(vtt_G23x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names209,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y3  : virtual E23x7 , virtual F1 {
  int ff;
  ~G23x7y3(); // tgen
  G23x7y3(); // tgen
};
//SIG(1 G23x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G23x7y3 ::~G23x7y3(){ note_dtor("G23x7y3", this);} // tgen
G23x7y3 ::G23x7y3(){ note_ctor("G23x7y3", this);} // tgen

static void Test_G23x7y3()
{
  extern Class_Descriptor cd_G23x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G23x7y3, buf);
    G23x7y3 *dp, &lv = *(dp=new (buf) G23x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G23x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y3)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,28), "G23x7y3");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,16), "G23x7y3");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(32,16), "G23x7y3");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(60,36), "G23x7y3");
    check_base_class_offset(lv, (E23x7*), ABISELECT(16,8), "G23x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G23x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x7y3.ff");
    test_class_info(&lv, &cd_G23x7y3);
    dp->~G23x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y3(Test_G23x7y3, "G23x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G23x7y3C1Ev();
extern void _ZN7G23x7y3D1Ev();
Name_Map name_map_G23x7y3[] = {
  NSPAIR(_ZN7G23x7y3C1Ev),
  NSPAIR(_ZN7G23x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G23x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y3[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G23x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G23x7y3[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G23x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G23x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G23x7y3[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y3[] = {
  {&(_ZTV7G23x7y3[7]),  7,25},
  {&(_ZTV7G23x7y3[12]),  12,25},
  {&(_ZTV7G23x7y3[16]),  16,25},
  {&(_ZTV7G23x7y3[20]),  20,25},
  {&(_ZTV7G23x7y3[24]),  24,25},
  {&(_tg__ZTV5E23x7__7G23x7y3[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y3[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y3[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x7y3[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y3[];
extern  VTBL_ENTRY _ZTV7G23x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y3[];
static VTBL_ENTRY alt_thunk_names210[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y3 = {  "G23x7y3", // class name
  bases_G23x7y3, 6,
  &(vtc_G23x7y3[0]), // expected_vtbl_contents
  &(vtt_G23x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G23x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names210,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y4  : E23x7 , F0 {
  int ff;
  ~G23x7y4(); // tgen
  G23x7y4(); // tgen
};
//SIG(1 G23x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G23x7y4 ::~G23x7y4(){ note_dtor("G23x7y4", this);} // tgen
G23x7y4 ::G23x7y4(){ note_ctor("G23x7y4", this);} // tgen

static void Test_G23x7y4()
{
  extern Class_Descriptor cd_G23x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x7y4, buf);
    G23x7y4 *dp, &lv = *(dp=new (buf) G23x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y4)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(40,28), "G23x7y4");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(24,16), "G23x7y4");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(24,16), "G23x7y4");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(52,36), "G23x7y4");
    check_base_class_offset(lv, (E23x7*), 0, "G23x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G23x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G23x7y4.ff");
    test_class_info(&lv, &cd_G23x7y4);
    dp->~G23x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y4(Test_G23x7y4, "G23x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x7y4C1Ev();
extern void _ZN7G23x7y4D1Ev();
Name_Map name_map_G23x7y4[] = {
  NSPAIR(_ZN7G23x7y4C1Ev),
  NSPAIR(_ZN7G23x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y4[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G23x7y4[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G23x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x7y4[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y4[] = {
  {&(_ZTV7G23x7y4[5]),  5,14},
  {&(_tg__ZTV5E23x7__7G23x7y4[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y4[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y4[3]),  3,4},
  {&(_ZTV7G23x7y4[9]),  9,14},
  {&(_ZTV7G23x7y4[13]),  13,14},
  {&(_tg__ZTV3C23__7G23x7y4[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y4[];
extern  VTBL_ENTRY _ZTV7G23x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y4[];
static VTBL_ENTRY alt_thunk_names211[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y4 = {  "G23x7y4", // class name
  bases_G23x7y4, 6,
  &(vtc_G23x7y4[0]), // expected_vtbl_contents
  &(vtt_G23x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names211,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y5  : virtual E23x7 , F0 {
  int ff;
  ~G23x7y5(); // tgen
  G23x7y5(); // tgen
};
//SIG(1 G23x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G23x7y5 ::~G23x7y5(){ note_dtor("G23x7y5", this);} // tgen
G23x7y5 ::G23x7y5(){ note_ctor("G23x7y5", this);} // tgen

static void Test_G23x7y5()
{
  extern Class_Descriptor cd_G23x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G23x7y5, buf);
    G23x7y5 *dp, &lv = *(dp=new (buf) G23x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G23x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y5)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,32), "G23x7y5");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,20), "G23x7y5");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(32,20), "G23x7y5");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(60,40), "G23x7y5");
    check_base_class_offset(lv, (E23x7*), ABISELECT(16,12), "G23x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G23x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x7y5.ff");
    test_class_info(&lv, &cd_G23x7y5);
    dp->~G23x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y5(Test_G23x7y5, "G23x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G23x7y5C1Ev();
extern void _ZN7G23x7y5D1Ev();
Name_Map name_map_G23x7y5[] = {
  NSPAIR(_ZN7G23x7y5C1Ev),
  NSPAIR(_ZN7G23x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y5[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G23x7y5[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G23x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x7y5[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y5[] = {
  {&(_ZTV7G23x7y5[6]),  6,20},
  {&(_ZTV7G23x7y5[11]),  11,20},
  {&(_ZTV7G23x7y5[15]),  15,20},
  {&(_ZTV7G23x7y5[19]),  19,20},
  {&(_tg__ZTV5E23x7__7G23x7y5[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y5[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y5[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x7y5[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y5[];
extern  VTBL_ENTRY _ZTV7G23x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y5[];
static VTBL_ENTRY alt_thunk_names212[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y5 = {  "G23x7y5", // class name
  bases_G23x7y5, 6,
  &(vtc_G23x7y5[0]), // expected_vtbl_contents
  &(vtt_G23x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G23x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names212,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y6  : E23x7 , virtual F0 {
  int ff;
  ~G23x7y6(); // tgen
  G23x7y6(); // tgen
};
//SIG(1 G23x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x7y6 ::~G23x7y6(){ note_dtor("G23x7y6", this);} // tgen
G23x7y6 ::G23x7y6(){ note_ctor("G23x7y6", this);} // tgen

static void Test_G23x7y6()
{
  extern Class_Descriptor cd_G23x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G23x7y6, buf);
    G23x7y6 *dp, &lv = *(dp=new (buf) G23x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G23x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y6)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(32,24), "G23x7y6");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(16,12), "G23x7y6");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(16,12), "G23x7y6");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(44,32), "G23x7y6");
    check_base_class_offset(lv, (E23x7*), 0, "G23x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G23x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G23x7y6.ff");
    test_class_info(&lv, &cd_G23x7y6);
    dp->~G23x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y6(Test_G23x7y6, "G23x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G23x7y6C1Ev();
extern void _ZN7G23x7y6D1Ev();
Name_Map name_map_G23x7y6[] = {
  NSPAIR(_ZN7G23x7y6C1Ev),
  NSPAIR(_ZN7G23x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y6[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G23x7y6[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G23x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x7y6[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y6[] = {
  {&(_ZTV7G23x7y6[6]),  6,15},
  {&(_tg__ZTV5E23x7__7G23x7y6[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y6[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y6[3]),  3,4},
  {&(_ZTV7G23x7y6[10]),  10,15},
  {&(_ZTV7G23x7y6[14]),  14,15},
  {&(_tg__ZTV3C23__7G23x7y6[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y6[];
extern  VTBL_ENTRY _ZTV7G23x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y6[];
static VTBL_ENTRY alt_thunk_names213[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y6 = {  "G23x7y6", // class name
  bases_G23x7y6, 6,
  &(vtc_G23x7y6[0]), // expected_vtbl_contents
  &(vtt_G23x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G23x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names213,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G23x7y7  : virtual E23x7 , virtual F0 {
  int ff;
  ~G23x7y7(); // tgen
  G23x7y7(); // tgen
};
//SIG(1 G23x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} BC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G23x7y7 ::~G23x7y7(){ note_dtor("G23x7y7", this);} // tgen
G23x7y7 ::G23x7y7(){ note_ctor("G23x7y7", this);} // tgen

static void Test_G23x7y7()
{
  extern Class_Descriptor cd_G23x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G23x7y7, buf);
    G23x7y7 *dp, &lv = *(dp=new (buf) G23x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G23x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G23x7y7)");
    check_base_class_offset(lv, (A1*)(C23*), ABISELECT(48,28), "G23x7y7");
    check_base_class_offset(lv, (B1*)(C23*), ABISELECT(32,16), "G23x7y7");
    check_base_class_offset(lv, (C23*)(E23x7*), ABISELECT(32,16), "G23x7y7");
    check_base_class_offset(lv, (D0*)(E23x7*), ABISELECT(60,36), "G23x7y7");
    check_base_class_offset(lv, (E23x7*), ABISELECT(16,8), "G23x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G23x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G23x7y7.ff");
    test_class_info(&lv, &cd_G23x7y7);
    dp->~G23x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG23x7y7(Test_G23x7y7, "G23x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G23x7y7C1Ev();
extern void _ZN7G23x7y7D1Ev();
Name_Map name_map_G23x7y7[] = {
  NSPAIR(_ZN7G23x7y7C1Ev),
  NSPAIR(_ZN7G23x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C23;
extern VTBL_ENTRY _ZTI3C23[];
extern  VTBL_ENTRY _ZTV3C23[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C23[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E23x7;
extern VTBL_ENTRY _ZTI5E23x7[];
extern  VTBL_ENTRY _ZTV5E23x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E23x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G23x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_C23,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E23x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G23x7y7[];
extern void _ZN3C233fooEv();
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G23x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G23x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G23x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G23x7y7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G23x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern VTBL_ENTRY _ZTV7G23x7y7[];
static  VTBL_ENTRY _tg__ZTV5E23x7__7G23x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__5E23x7__7G23x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E23x7__7G23x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E23x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
extern void _ZN3C233fooEv();
static  VTBL_ENTRY _tg__ZTV3C23__7G23x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&_ZN3C233fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv)();
extern void ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C23__7G23x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C23[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv),
};
static  VTT_ENTRY vtt_G23x7y7[] = {
  {&(_ZTV7G23x7y7[7]),  7,21},
  {&(_ZTV7G23x7y7[12]),  12,21},
  {&(_ZTV7G23x7y7[16]),  16,21},
  {&(_ZTV7G23x7y7[20]),  20,21},
  {&(_tg__ZTV5E23x7__7G23x7y7[5]),  5,5},
  {&(_tg__ZTV3C23__5E23x7__7G23x7y7[4]),  4,5},
  {&(_tg__ZTV2A1__5E23x7__7G23x7y7[3]),  3,4},
  {&(_tg__ZTV3C23__7G23x7y7[3]),  3,4},
  {&(_tg__ZTV2A1__3C23__7G23x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G23x7y7[];
extern  VTBL_ENTRY _ZTV7G23x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G23x7y7[];
static VTBL_ENTRY alt_thunk_names214[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C233fooEv,_ZTv0_n12_N3C233fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C233fooEv,_ZThn12_N3C233fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G23x7y7 = {  "G23x7y7", // class name
  bases_G23x7y7, 6,
  &(vtc_G23x7y7[0]), // expected_vtbl_contents
  &(vtt_G23x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G23x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G23x7y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G23x7y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names214,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E24x7  : virtual C24 , virtual D0 {
  int fd;
  ~E24x7(); // tgen
  E24x7(); // tgen
};
//SIG(-1 E24x7) C1{ VBC2{ BC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E24x7 ::~E24x7(){ note_dtor("E24x7", this);} // tgen
E24x7 ::E24x7(){ note_ctor("E24x7", this);} // tgen

static void Test_E24x7()
{
  extern Class_Descriptor cd_E24x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E24x7, buf);
    E24x7 *dp, &lv = *(dp=new (buf) E24x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E24x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E24x7)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,12), "E24x7");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,20), "E24x7");
    check_base_class_offset(lv, (C24*), ABISELECT(16,8), "E24x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E24x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E24x7.fd");
    test_class_info(&lv, &cd_E24x7);
    dp->~E24x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE24x7(Test_E24x7, "E24x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E24x7C1Ev();
extern void _ZN5E24x7D1Ev();
Name_Map name_map_E24x7[] = {
  NSPAIR(_ZN5E24x7C1Ev),
  NSPAIR(_ZN5E24x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E24x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E24x7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_E24x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV5E24x7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_E24x7[] = {
  {&(_ZTV5E24x7[5]),  5,10},
  {&(_ZTV5E24x7[9]),  9,10},
  {&(_tg__ZTV3C24__5E24x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
Class_Descriptor cd_E24x7 = {  "E24x7", // class name
  bases_E24x7, 4,
  &(vtc_E24x7[0]), // expected_vtbl_contents
  &(vtt_E24x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E24x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E24x7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E24x7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y0  : E24x7 , F1 {
  int ff;
  ~G24x7y0(); // tgen
  G24x7y0(); // tgen
};
//SIG(1 G24x7y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x7y0 ::~G24x7y0(){ note_dtor("G24x7y0", this);} // tgen
G24x7y0 ::G24x7y0(){ note_ctor("G24x7y0", this);} // tgen

static void Test_G24x7y0()
{
  extern Class_Descriptor cd_G24x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x7y0, buf);
    G24x7y0 *dp, &lv = *(dp=new (buf) G24x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y0)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x7y0");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x7y0");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(32,20), "G24x7y0");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(52,36), "G24x7y0");
    check_base_class_offset(lv, (E24x7*), 0, "G24x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G24x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G24x7y0.ff");
    test_class_info(&lv, &cd_G24x7y0);
    dp->~G24x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y0(Test_G24x7y0, "G24x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x7y0C1Ev();
extern void _ZN7G24x7y0D1Ev();
Name_Map name_map_G24x7y0[] = {
  NSPAIR(_ZN7G24x7y0C1Ev),
  NSPAIR(_ZN7G24x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G24x7y0[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y0[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y0[] = {
  {&(_ZTV7G24x7y0[5]),  5,13},
  {&(_tg__ZTV5E24x7__7G24x7y0[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y0[4]),  4,5},
  {&(_ZTV7G24x7y0[12]),  12,13},
  {&(_tg__ZTV3C24__7G24x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y0[];
extern  VTBL_ENTRY _ZTV7G24x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y0[];
Class_Descriptor cd_G24x7y0 = {  "G24x7y0", // class name
  bases_G24x7y0, 6,
  &(vtc_G24x7y0[0]), // expected_vtbl_contents
  &(vtt_G24x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y1  : virtual E24x7 , F1 {
  int ff;
  ~G24x7y1(); // tgen
  G24x7y1(); // tgen
};
//SIG(1 G24x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G24x7y1 ::~G24x7y1(){ note_dtor("G24x7y1", this);} // tgen
G24x7y1 ::G24x7y1(){ note_ctor("G24x7y1", this);} // tgen

static void Test_G24x7y1()
{
  extern Class_Descriptor cd_G24x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x7y1, buf);
    G24x7y1 *dp, &lv = *(dp=new (buf) G24x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y1)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x7y1");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x7y1");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(32,20), "G24x7y1");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(52,36), "G24x7y1");
    check_base_class_offset(lv, (E24x7*), ABISELECT(16,12), "G24x7y1");
    check_base_class_offset(lv, (F1*), 0, "G24x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x7y1.ff");
    test_class_info(&lv, &cd_G24x7y1);
    dp->~G24x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y1(Test_G24x7y1, "G24x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x7y1C1Ev();
extern void _ZN7G24x7y1D1Ev();
Name_Map name_map_G24x7y1[] = {
  NSPAIR(_ZN7G24x7y1C1Ev),
  NSPAIR(_ZN7G24x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G24x7y1[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y1[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y1[] = {
  {&(_ZTV7G24x7y1[6]),  6,17},
  {&(_ZTV7G24x7y1[12]),  12,17},
  {&(_ZTV7G24x7y1[16]),  16,17},
  {&(_tg__ZTV5E24x7__7G24x7y1[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y1[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y1[];
extern  VTBL_ENTRY _ZTV7G24x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y1[];
Class_Descriptor cd_G24x7y1 = {  "G24x7y1", // class name
  bases_G24x7y1, 6,
  &(vtc_G24x7y1[0]), // expected_vtbl_contents
  &(vtt_G24x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y2  : E24x7 , virtual F1 {
  int ff;
  ~G24x7y2(); // tgen
  G24x7y2(); // tgen
};
//SIG(1 G24x7y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x7y2 ::~G24x7y2(){ note_dtor("G24x7y2", this);} // tgen
G24x7y2 ::G24x7y2(){ note_ctor("G24x7y2", this);} // tgen

static void Test_G24x7y2()
{
  extern Class_Descriptor cd_G24x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x7y2, buf);
    G24x7y2 *dp, &lv = *(dp=new (buf) G24x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y2)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,16), "G24x7y2");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,24), "G24x7y2");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(16,12), "G24x7y2");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(36,28), "G24x7y2");
    check_base_class_offset(lv, (E24x7*), 0, "G24x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G24x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x7y2.ff");
    test_class_info(&lv, &cd_G24x7y2);
    dp->~G24x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y2(Test_G24x7y2, "G24x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x7y2C1Ev();
extern void _ZN7G24x7y2D1Ev();
Name_Map name_map_G24x7y2[] = {
  NSPAIR(_ZN7G24x7y2C1Ev),
  NSPAIR(_ZN7G24x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y2[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x7y2[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G24x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y2[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y2[] = {
  {&(_ZTV7G24x7y2[6]),  6,15},
  {&(_tg__ZTV5E24x7__7G24x7y2[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y2[4]),  4,5},
  {&(_ZTV7G24x7y2[10]),  10,15},
  {&(_ZTV7G24x7y2[14]),  14,15},
  {&(_tg__ZTV3C24__7G24x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y2[];
extern  VTBL_ENTRY _ZTV7G24x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y2[];
Class_Descriptor cd_G24x7y2 = {  "G24x7y2", // class name
  bases_G24x7y2, 6,
  &(vtc_G24x7y2[0]), // expected_vtbl_contents
  &(vtt_G24x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y3  : virtual E24x7 , virtual F1 {
  int ff;
  ~G24x7y3(); // tgen
  G24x7y3(); // tgen
};
//SIG(1 G24x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G24x7y3 ::~G24x7y3(){ note_dtor("G24x7y3", this);} // tgen
G24x7y3 ::G24x7y3(){ note_ctor("G24x7y3", this);} // tgen

static void Test_G24x7y3()
{
  extern Class_Descriptor cd_G24x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G24x7y3, buf);
    G24x7y3 *dp, &lv = *(dp=new (buf) G24x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G24x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y3)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,20), "G24x7y3");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,28), "G24x7y3");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(32,16), "G24x7y3");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(52,32), "G24x7y3");
    check_base_class_offset(lv, (E24x7*), ABISELECT(16,8), "G24x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G24x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x7y3.ff");
    test_class_info(&lv, &cd_G24x7y3);
    dp->~G24x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y3(Test_G24x7y3, "G24x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G24x7y3C1Ev();
extern void _ZN7G24x7y3D1Ev();
Name_Map name_map_G24x7y3[] = {
  NSPAIR(_ZN7G24x7y3C1Ev),
  NSPAIR(_ZN7G24x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G24x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y3[];
extern void _ZN3C243fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G24x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G24x7y3[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G24x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y3[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y3[] = {
  {&(_ZTV7G24x7y3[7]),  7,21},
  {&(_ZTV7G24x7y3[12]),  12,21},
  {&(_ZTV7G24x7y3[16]),  16,21},
  {&(_ZTV7G24x7y3[20]),  20,21},
  {&(_tg__ZTV5E24x7__7G24x7y3[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y3[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y3[];
extern  VTBL_ENTRY _ZTV7G24x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y3[];
Class_Descriptor cd_G24x7y3 = {  "G24x7y3", // class name
  bases_G24x7y3, 6,
  &(vtc_G24x7y3[0]), // expected_vtbl_contents
  &(vtt_G24x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G24x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y4  : E24x7 , F0 {
  int ff;
  ~G24x7y4(); // tgen
  G24x7y4(); // tgen
};
//SIG(1 G24x7y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G24x7y4 ::~G24x7y4(){ note_dtor("G24x7y4", this);} // tgen
G24x7y4 ::G24x7y4(){ note_ctor("G24x7y4", this);} // tgen

static void Test_G24x7y4()
{
  extern Class_Descriptor cd_G24x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x7y4, buf);
    G24x7y4 *dp, &lv = *(dp=new (buf) G24x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y4)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(32,20), "G24x7y4");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(40,28), "G24x7y4");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(24,16), "G24x7y4");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(44,32), "G24x7y4");
    check_base_class_offset(lv, (E24x7*), 0, "G24x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G24x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G24x7y4.ff");
    test_class_info(&lv, &cd_G24x7y4);
    dp->~G24x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y4(Test_G24x7y4, "G24x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x7y4C1Ev();
extern void _ZN7G24x7y4D1Ev();
Name_Map name_map_G24x7y4[] = {
  NSPAIR(_ZN7G24x7y4C1Ev),
  NSPAIR(_ZN7G24x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y4[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G24x7y4[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y4[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y4[] = {
  {&(_ZTV7G24x7y4[5]),  5,10},
  {&(_tg__ZTV5E24x7__7G24x7y4[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y4[4]),  4,5},
  {&(_ZTV7G24x7y4[9]),  9,10},
  {&(_tg__ZTV3C24__7G24x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y4[];
extern  VTBL_ENTRY _ZTV7G24x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y4[];
Class_Descriptor cd_G24x7y4 = {  "G24x7y4", // class name
  bases_G24x7y4, 6,
  &(vtc_G24x7y4[0]), // expected_vtbl_contents
  &(vtt_G24x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y5  : virtual E24x7 , F0 {
  int ff;
  ~G24x7y5(); // tgen
  G24x7y5(); // tgen
};
//SIG(1 G24x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G24x7y5 ::~G24x7y5(){ note_dtor("G24x7y5", this);} // tgen
G24x7y5 ::G24x7y5(){ note_ctor("G24x7y5", this);} // tgen

static void Test_G24x7y5()
{
  extern Class_Descriptor cd_G24x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G24x7y5, buf);
    G24x7y5 *dp, &lv = *(dp=new (buf) G24x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G24x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y5)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,24), "G24x7y5");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,32), "G24x7y5");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(32,20), "G24x7y5");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(52,36), "G24x7y5");
    check_base_class_offset(lv, (E24x7*), ABISELECT(16,12), "G24x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G24x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x7y5.ff");
    test_class_info(&lv, &cd_G24x7y5);
    dp->~G24x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y5(Test_G24x7y5, "G24x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G24x7y5C1Ev();
extern void _ZN7G24x7y5D1Ev();
Name_Map name_map_G24x7y5[] = {
  NSPAIR(_ZN7G24x7y5C1Ev),
  NSPAIR(_ZN7G24x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y5[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G24x7y5[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y5[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y5[] = {
  {&(_ZTV7G24x7y5[6]),  6,16},
  {&(_ZTV7G24x7y5[11]),  11,16},
  {&(_ZTV7G24x7y5[15]),  15,16},
  {&(_tg__ZTV5E24x7__7G24x7y5[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y5[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y5[];
extern  VTBL_ENTRY _ZTV7G24x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y5[];
Class_Descriptor cd_G24x7y5 = {  "G24x7y5", // class name
  bases_G24x7y5, 6,
  &(vtc_G24x7y5[0]), // expected_vtbl_contents
  &(vtt_G24x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G24x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y6  : E24x7 , virtual F0 {
  int ff;
  ~G24x7y6(); // tgen
  G24x7y6(); // tgen
};
//SIG(1 G24x7y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x7y6 ::~G24x7y6(){ note_dtor("G24x7y6", this);} // tgen
G24x7y6 ::G24x7y6(){ note_ctor("G24x7y6", this);} // tgen

static void Test_G24x7y6()
{
  extern Class_Descriptor cd_G24x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G24x7y6, buf);
    G24x7y6 *dp, &lv = *(dp=new (buf) G24x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G24x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y6)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(24,16), "G24x7y6");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(32,24), "G24x7y6");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(16,12), "G24x7y6");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(36,28), "G24x7y6");
    check_base_class_offset(lv, (E24x7*), 0, "G24x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G24x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G24x7y6.ff");
    test_class_info(&lv, &cd_G24x7y6);
    dp->~G24x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y6(Test_G24x7y6, "G24x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G24x7y6C1Ev();
extern void _ZN7G24x7y6D1Ev();
Name_Map name_map_G24x7y6[] = {
  NSPAIR(_ZN7G24x7y6C1Ev),
  NSPAIR(_ZN7G24x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y6[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G24x7y6[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y6[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y6[] = {
  {&(_ZTV7G24x7y6[6]),  6,11},
  {&(_tg__ZTV5E24x7__7G24x7y6[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y6[4]),  4,5},
  {&(_ZTV7G24x7y6[10]),  10,11},
  {&(_tg__ZTV3C24__7G24x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y6[];
extern  VTBL_ENTRY _ZTV7G24x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y6[];
Class_Descriptor cd_G24x7y6 = {  "G24x7y6", // class name
  bases_G24x7y6, 6,
  &(vtc_G24x7y6[0]), // expected_vtbl_contents
  &(vtt_G24x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G24x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G24x7y7  : virtual E24x7 , virtual F0 {
  int ff;
  ~G24x7y7(); // tgen
  G24x7y7(); // tgen
};
//SIG(1 G24x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G24x7y7 ::~G24x7y7(){ note_dtor("G24x7y7", this);} // tgen
G24x7y7 ::G24x7y7(){ note_ctor("G24x7y7", this);} // tgen

static void Test_G24x7y7()
{
  extern Class_Descriptor cd_G24x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G24x7y7, buf);
    G24x7y7 *dp, &lv = *(dp=new (buf) G24x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G24x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G24x7y7)");
    check_base_class_offset(lv, (A0*)(C24*), ABISELECT(40,20), "G24x7y7");
    check_base_class_offset(lv, (B0*)(C24*), ABISELECT(48,28), "G24x7y7");
    check_base_class_offset(lv, (C24*)(E24x7*), ABISELECT(32,16), "G24x7y7");
    check_base_class_offset(lv, (D0*)(E24x7*), ABISELECT(52,32), "G24x7y7");
    check_base_class_offset(lv, (E24x7*), ABISELECT(16,8), "G24x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G24x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G24x7y7.ff");
    test_class_info(&lv, &cd_G24x7y7);
    dp->~G24x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG24x7y7(Test_G24x7y7, "G24x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G24x7y7C1Ev();
extern void _ZN7G24x7y7D1Ev();
Name_Map name_map_G24x7y7[] = {
  NSPAIR(_ZN7G24x7y7C1Ev),
  NSPAIR(_ZN7G24x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C24;
extern VTBL_ENTRY _ZTI3C24[];
extern  VTBL_ENTRY _ZTV3C24[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C24[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E24x7;
extern VTBL_ENTRY _ZTI5E24x7[];
extern  VTBL_ENTRY _ZTV5E24x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E24x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G24x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C24,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E24x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G24x7y7[];
extern void _ZN3C243fooEv();
static  VTBL_ENTRY vtc_G24x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G24x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G24x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G24x7y7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern VTBL_ENTRY _ZTV7G24x7y7[];
static  VTBL_ENTRY _tg__ZTV5E24x7__7G24x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__5E24x7__7G24x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E24x7[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
extern void _ZN3C243fooEv();
static  VTBL_ENTRY _tg__ZTV3C24__7G24x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C24[0]),
  (VTBL_ENTRY)&_ZN3C243fooEv,
};
static  VTT_ENTRY vtt_G24x7y7[] = {
  {&(_ZTV7G24x7y7[7]),  7,17},
  {&(_ZTV7G24x7y7[12]),  12,17},
  {&(_ZTV7G24x7y7[16]),  16,17},
  {&(_tg__ZTV5E24x7__7G24x7y7[5]),  5,5},
  {&(_tg__ZTV3C24__5E24x7__7G24x7y7[4]),  4,5},
  {&(_tg__ZTV3C24__7G24x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G24x7y7[];
extern  VTBL_ENTRY _ZTV7G24x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G24x7y7[];
Class_Descriptor cd_G24x7y7 = {  "G24x7y7", // class name
  bases_G24x7y7, 6,
  &(vtc_G24x7y7[0]), // expected_vtbl_contents
  &(vtt_G24x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G24x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G24x7y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G24x7y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E25x7  : virtual C25 , virtual D0 {
  int fd;
  ~E25x7(); // tgen
  E25x7(); // tgen
};
//SIG(-1 E25x7) C1{ VBC2{ BC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E25x7 ::~E25x7(){ note_dtor("E25x7", this);} // tgen
E25x7 ::E25x7(){ note_ctor("E25x7", this);} // tgen

static void Test_E25x7()
{
  extern Class_Descriptor cd_E25x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E25x7, buf);
    E25x7 *dp, &lv = *(dp=new (buf) E25x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E25x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E25x7)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,8), "E25x7");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,20), "E25x7");
    check_base_class_offset(lv, (C25*), ABISELECT(16,8), "E25x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E25x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E25x7.fd");
    test_class_info(&lv, &cd_E25x7);
    dp->~E25x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE25x7(Test_E25x7, "E25x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E25x7C1Ev();
extern void _ZN5E25x7D1Ev();
Name_Map name_map_E25x7[] = {
  NSPAIR(_ZN5E25x7C1Ev),
  NSPAIR(_ZN5E25x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E25x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E25x7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_E25x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV5E25x7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_E25x7[] = {
  {&(_ZTV5E25x7[5]),  5,10},
  {&(_ZTV5E25x7[9]),  9,10},
  {&(_tg__ZTV3C25__5E25x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
Class_Descriptor cd_E25x7 = {  "E25x7", // class name
  bases_E25x7, 4,
  &(vtc_E25x7[0]), // expected_vtbl_contents
  &(vtt_E25x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E25x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E25x7),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E25x7),3, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y0  : E25x7 , F1 {
  int ff;
  ~G25x7y0(); // tgen
  G25x7y0(); // tgen
};
//SIG(1 G25x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x7y0 ::~G25x7y0(){ note_dtor("G25x7y0", this);} // tgen
G25x7y0 ::G25x7y0(){ note_ctor("G25x7y0", this);} // tgen

static void Test_G25x7y0()
{
  extern Class_Descriptor cd_G25x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x7y0, buf);
    G25x7y0 *dp, &lv = *(dp=new (buf) G25x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y0)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x7y0");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x7y0");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(32,20), "G25x7y0");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(52,36), "G25x7y0");
    check_base_class_offset(lv, (E25x7*), 0, "G25x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G25x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G25x7y0.ff");
    test_class_info(&lv, &cd_G25x7y0);
    dp->~G25x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y0(Test_G25x7y0, "G25x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x7y0C1Ev();
extern void _ZN7G25x7y0D1Ev();
Name_Map name_map_G25x7y0[] = {
  NSPAIR(_ZN7G25x7y0C1Ev),
  NSPAIR(_ZN7G25x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G25x7y0[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y0[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y0[] = {
  {&(_ZTV7G25x7y0[5]),  5,13},
  {&(_tg__ZTV5E25x7__7G25x7y0[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y0[4]),  4,5},
  {&(_ZTV7G25x7y0[12]),  12,13},
  {&(_tg__ZTV3C25__7G25x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y0[];
extern  VTBL_ENTRY _ZTV7G25x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y0[];
Class_Descriptor cd_G25x7y0 = {  "G25x7y0", // class name
  bases_G25x7y0, 6,
  &(vtc_G25x7y0[0]), // expected_vtbl_contents
  &(vtt_G25x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y0),13, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y0),5, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y1  : virtual E25x7 , F1 {
  int ff;
  ~G25x7y1(); // tgen
  G25x7y1(); // tgen
};
//SIG(1 G25x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G25x7y1 ::~G25x7y1(){ note_dtor("G25x7y1", this);} // tgen
G25x7y1 ::G25x7y1(){ note_ctor("G25x7y1", this);} // tgen

static void Test_G25x7y1()
{
  extern Class_Descriptor cd_G25x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x7y1, buf);
    G25x7y1 *dp, &lv = *(dp=new (buf) G25x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y1)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x7y1");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x7y1");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(32,20), "G25x7y1");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(52,36), "G25x7y1");
    check_base_class_offset(lv, (E25x7*), ABISELECT(16,12), "G25x7y1");
    check_base_class_offset(lv, (F1*), 0, "G25x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x7y1.ff");
    test_class_info(&lv, &cd_G25x7y1);
    dp->~G25x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y1(Test_G25x7y1, "G25x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x7y1C1Ev();
extern void _ZN7G25x7y1D1Ev();
Name_Map name_map_G25x7y1[] = {
  NSPAIR(_ZN7G25x7y1C1Ev),
  NSPAIR(_ZN7G25x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G25x7y1[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y1[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y1[] = {
  {&(_ZTV7G25x7y1[6]),  6,17},
  {&(_ZTV7G25x7y1[12]),  12,17},
  {&(_ZTV7G25x7y1[16]),  16,17},
  {&(_tg__ZTV5E25x7__7G25x7y1[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y1[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y1[];
extern  VTBL_ENTRY _ZTV7G25x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y1[];
Class_Descriptor cd_G25x7y1 = {  "G25x7y1", // class name
  bases_G25x7y1, 6,
  &(vtc_G25x7y1[0]), // expected_vtbl_contents
  &(vtt_G25x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y1),17, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y1),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y2  : E25x7 , virtual F1 {
  int ff;
  ~G25x7y2(); // tgen
  G25x7y2(); // tgen
};
//SIG(1 G25x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x7y2 ::~G25x7y2(){ note_dtor("G25x7y2", this);} // tgen
G25x7y2 ::G25x7y2(){ note_ctor("G25x7y2", this);} // tgen

static void Test_G25x7y2()
{
  extern Class_Descriptor cd_G25x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x7y2, buf);
    G25x7y2 *dp, &lv = *(dp=new (buf) G25x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y2)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,12), "G25x7y2");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,24), "G25x7y2");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(16,12), "G25x7y2");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(36,28), "G25x7y2");
    check_base_class_offset(lv, (E25x7*), 0, "G25x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G25x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x7y2.ff");
    test_class_info(&lv, &cd_G25x7y2);
    dp->~G25x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y2(Test_G25x7y2, "G25x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x7y2C1Ev();
extern void _ZN7G25x7y2D1Ev();
Name_Map name_map_G25x7y2[] = {
  NSPAIR(_ZN7G25x7y2C1Ev),
  NSPAIR(_ZN7G25x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y2[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x7y2[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G25x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y2[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y2[] = {
  {&(_ZTV7G25x7y2[6]),  6,15},
  {&(_tg__ZTV5E25x7__7G25x7y2[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y2[4]),  4,5},
  {&(_ZTV7G25x7y2[10]),  10,15},
  {&(_ZTV7G25x7y2[14]),  14,15},
  {&(_tg__ZTV3C25__7G25x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y2[];
extern  VTBL_ENTRY _ZTV7G25x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y2[];
Class_Descriptor cd_G25x7y2 = {  "G25x7y2", // class name
  bases_G25x7y2, 6,
  &(vtc_G25x7y2[0]), // expected_vtbl_contents
  &(vtt_G25x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y2),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y2),6, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y3  : virtual E25x7 , virtual F1 {
  int ff;
  ~G25x7y3(); // tgen
  G25x7y3(); // tgen
};
//SIG(1 G25x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G25x7y3 ::~G25x7y3(){ note_dtor("G25x7y3", this);} // tgen
G25x7y3 ::G25x7y3(){ note_ctor("G25x7y3", this);} // tgen

static void Test_G25x7y3()
{
  extern Class_Descriptor cd_G25x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G25x7y3, buf);
    G25x7y3 *dp, &lv = *(dp=new (buf) G25x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G25x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y3)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,16), "G25x7y3");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,28), "G25x7y3");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(32,16), "G25x7y3");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(52,32), "G25x7y3");
    check_base_class_offset(lv, (E25x7*), ABISELECT(16,8), "G25x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G25x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x7y3.ff");
    test_class_info(&lv, &cd_G25x7y3);
    dp->~G25x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y3(Test_G25x7y3, "G25x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G25x7y3C1Ev();
extern void _ZN7G25x7y3D1Ev();
Name_Map name_map_G25x7y3[] = {
  NSPAIR(_ZN7G25x7y3C1Ev),
  NSPAIR(_ZN7G25x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G25x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y3[];
extern void _ZN3C253fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G25x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G25x7y3[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G25x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y3[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y3[] = {
  {&(_ZTV7G25x7y3[7]),  7,21},
  {&(_ZTV7G25x7y3[12]),  12,21},
  {&(_ZTV7G25x7y3[16]),  16,21},
  {&(_ZTV7G25x7y3[20]),  20,21},
  {&(_tg__ZTV5E25x7__7G25x7y3[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y3[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y3[];
extern  VTBL_ENTRY _ZTV7G25x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y3[];
Class_Descriptor cd_G25x7y3 = {  "G25x7y3", // class name
  bases_G25x7y3, 6,
  &(vtc_G25x7y3[0]), // expected_vtbl_contents
  &(vtt_G25x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G25x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y3),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y3),7, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y4  : E25x7 , F0 {
  int ff;
  ~G25x7y4(); // tgen
  G25x7y4(); // tgen
};
//SIG(1 G25x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G25x7y4 ::~G25x7y4(){ note_dtor("G25x7y4", this);} // tgen
G25x7y4 ::G25x7y4(){ note_ctor("G25x7y4", this);} // tgen

static void Test_G25x7y4()
{
  extern Class_Descriptor cd_G25x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x7y4, buf);
    G25x7y4 *dp, &lv = *(dp=new (buf) G25x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y4)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(24,16), "G25x7y4");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(40,28), "G25x7y4");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(24,16), "G25x7y4");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(44,32), "G25x7y4");
    check_base_class_offset(lv, (E25x7*), 0, "G25x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G25x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G25x7y4.ff");
    test_class_info(&lv, &cd_G25x7y4);
    dp->~G25x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y4(Test_G25x7y4, "G25x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x7y4C1Ev();
extern void _ZN7G25x7y4D1Ev();
Name_Map name_map_G25x7y4[] = {
  NSPAIR(_ZN7G25x7y4C1Ev),
  NSPAIR(_ZN7G25x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y4[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G25x7y4[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y4[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y4[] = {
  {&(_ZTV7G25x7y4[5]),  5,10},
  {&(_tg__ZTV5E25x7__7G25x7y4[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y4[4]),  4,5},
  {&(_ZTV7G25x7y4[9]),  9,10},
  {&(_tg__ZTV3C25__7G25x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y4[];
extern  VTBL_ENTRY _ZTV7G25x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y4[];
Class_Descriptor cd_G25x7y4 = {  "G25x7y4", // class name
  bases_G25x7y4, 6,
  &(vtc_G25x7y4[0]), // expected_vtbl_contents
  &(vtt_G25x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y4),10, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y4),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y5  : virtual E25x7 , F0 {
  int ff;
  ~G25x7y5(); // tgen
  G25x7y5(); // tgen
};
//SIG(1 G25x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G25x7y5 ::~G25x7y5(){ note_dtor("G25x7y5", this);} // tgen
G25x7y5 ::G25x7y5(){ note_ctor("G25x7y5", this);} // tgen

static void Test_G25x7y5()
{
  extern Class_Descriptor cd_G25x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G25x7y5, buf);
    G25x7y5 *dp, &lv = *(dp=new (buf) G25x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G25x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y5)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,20), "G25x7y5");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,32), "G25x7y5");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(32,20), "G25x7y5");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(52,36), "G25x7y5");
    check_base_class_offset(lv, (E25x7*), ABISELECT(16,12), "G25x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G25x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x7y5.ff");
    test_class_info(&lv, &cd_G25x7y5);
    dp->~G25x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y5(Test_G25x7y5, "G25x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G25x7y5C1Ev();
extern void _ZN7G25x7y5D1Ev();
Name_Map name_map_G25x7y5[] = {
  NSPAIR(_ZN7G25x7y5C1Ev),
  NSPAIR(_ZN7G25x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y5[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G25x7y5[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y5[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y5[] = {
  {&(_ZTV7G25x7y5[6]),  6,16},
  {&(_ZTV7G25x7y5[11]),  11,16},
  {&(_ZTV7G25x7y5[15]),  15,16},
  {&(_tg__ZTV5E25x7__7G25x7y5[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y5[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y5[];
extern  VTBL_ENTRY _ZTV7G25x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y5[];
Class_Descriptor cd_G25x7y5 = {  "G25x7y5", // class name
  bases_G25x7y5, 6,
  &(vtc_G25x7y5[0]), // expected_vtbl_contents
  &(vtt_G25x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G25x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y5),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y5),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y6  : E25x7 , virtual F0 {
  int ff;
  ~G25x7y6(); // tgen
  G25x7y6(); // tgen
};
//SIG(1 G25x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x7y6 ::~G25x7y6(){ note_dtor("G25x7y6", this);} // tgen
G25x7y6 ::G25x7y6(){ note_ctor("G25x7y6", this);} // tgen

static void Test_G25x7y6()
{
  extern Class_Descriptor cd_G25x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G25x7y6, buf);
    G25x7y6 *dp, &lv = *(dp=new (buf) G25x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G25x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y6)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(16,12), "G25x7y6");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(32,24), "G25x7y6");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(16,12), "G25x7y6");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(36,28), "G25x7y6");
    check_base_class_offset(lv, (E25x7*), 0, "G25x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G25x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G25x7y6.ff");
    test_class_info(&lv, &cd_G25x7y6);
    dp->~G25x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y6(Test_G25x7y6, "G25x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G25x7y6C1Ev();
extern void _ZN7G25x7y6D1Ev();
Name_Map name_map_G25x7y6[] = {
  NSPAIR(_ZN7G25x7y6C1Ev),
  NSPAIR(_ZN7G25x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y6[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G25x7y6[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y6[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y6[] = {
  {&(_ZTV7G25x7y6[6]),  6,11},
  {&(_tg__ZTV5E25x7__7G25x7y6[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y6[4]),  4,5},
  {&(_ZTV7G25x7y6[10]),  10,11},
  {&(_tg__ZTV3C25__7G25x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y6[];
extern  VTBL_ENTRY _ZTV7G25x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y6[];
Class_Descriptor cd_G25x7y6 = {  "G25x7y6", // class name
  bases_G25x7y6, 6,
  &(vtc_G25x7y6[0]), // expected_vtbl_contents
  &(vtt_G25x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G25x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y6),11, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y6),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G25x7y7  : virtual E25x7 , virtual F0 {
  int ff;
  ~G25x7y7(); // tgen
  G25x7y7(); // tgen
};
//SIG(1 G25x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G25x7y7 ::~G25x7y7(){ note_dtor("G25x7y7", this);} // tgen
G25x7y7 ::G25x7y7(){ note_ctor("G25x7y7", this);} // tgen

static void Test_G25x7y7()
{
  extern Class_Descriptor cd_G25x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G25x7y7, buf);
    G25x7y7 *dp, &lv = *(dp=new (buf) G25x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G25x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G25x7y7)");
    check_base_class_offset(lv, (A1*)(C25*), ABISELECT(32,16), "G25x7y7");
    check_base_class_offset(lv, (B0*)(C25*), ABISELECT(48,28), "G25x7y7");
    check_base_class_offset(lv, (C25*)(E25x7*), ABISELECT(32,16), "G25x7y7");
    check_base_class_offset(lv, (D0*)(E25x7*), ABISELECT(52,32), "G25x7y7");
    check_base_class_offset(lv, (E25x7*), ABISELECT(16,8), "G25x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G25x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G25x7y7.ff");
    test_class_info(&lv, &cd_G25x7y7);
    dp->~G25x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG25x7y7(Test_G25x7y7, "G25x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G25x7y7C1Ev();
extern void _ZN7G25x7y7D1Ev();
Name_Map name_map_G25x7y7[] = {
  NSPAIR(_ZN7G25x7y7C1Ev),
  NSPAIR(_ZN7G25x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C25;
extern VTBL_ENTRY _ZTI3C25[];
extern  VTBL_ENTRY _ZTV3C25[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C25[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E25x7;
extern VTBL_ENTRY _ZTI5E25x7[];
extern  VTBL_ENTRY _ZTV5E25x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E25x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G25x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C25,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E25x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G25x7y7[];
extern void _ZN3C253fooEv();
static  VTBL_ENTRY vtc_G25x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G25x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G25x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G25x7y7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern VTBL_ENTRY _ZTV7G25x7y7[];
static  VTBL_ENTRY _tg__ZTV5E25x7__7G25x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__5E25x7__7G25x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E25x7[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
extern void _ZN3C253fooEv();
static  VTBL_ENTRY _tg__ZTV3C25__7G25x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C25[0]),
  (VTBL_ENTRY)&_ZN3C253fooEv,
};
static  VTT_ENTRY vtt_G25x7y7[] = {
  {&(_ZTV7G25x7y7[7]),  7,17},
  {&(_ZTV7G25x7y7[12]),  12,17},
  {&(_ZTV7G25x7y7[16]),  16,17},
  {&(_tg__ZTV5E25x7__7G25x7y7[5]),  5,5},
  {&(_tg__ZTV3C25__5E25x7__7G25x7y7[4]),  4,5},
  {&(_tg__ZTV3C25__7G25x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G25x7y7[];
extern  VTBL_ENTRY _ZTV7G25x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G25x7y7[];
Class_Descriptor cd_G25x7y7 = {  "G25x7y7", // class name
  bases_G25x7y7, 6,
  &(vtc_G25x7y7[0]), // expected_vtbl_contents
  &(vtt_G25x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G25x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G25x7y7),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G25x7y7),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E26x7  : virtual C26 , virtual D0 {
  int fd;
  ~E26x7(); // tgen
  E26x7(); // tgen
};
//SIG(-1 E26x7) C1{ VBC2{ VBC3{ Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E26x7 ::~E26x7(){ note_dtor("E26x7", this);} // tgen
E26x7 ::E26x7(){ note_ctor("E26x7", this);} // tgen

static void Test_E26x7()
{
  extern Class_Descriptor cd_E26x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(6,8)];
    init_test(&cd_E26x7, buf);
    E26x7 *dp, &lv = *(dp=new (buf) E26x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(40,28), "sizeof(E26x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E26x7)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,16), "E26x7");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,20), "E26x7");
    check_base_class_offset(lv, (C26*), ABISELECT(16,8), "E26x7");
    check_base_class_offset(lv, (D0*), ABISELECT(36,24), "E26x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E26x7.fd");
    test_class_info(&lv, &cd_E26x7);
    dp->~E26x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE26x7(Test_E26x7, "E26x7", ABISELECT(40,28));

#else // __cplusplus

extern void _ZN5E26x7C1Ev();
extern void _ZN5E26x7D1Ev();
Name_Map name_map_E26x7[] = {
  NSPAIR(_ZN5E26x7C1Ev),
  NSPAIR(_ZN5E26x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E26x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    3, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E26x7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_E26x7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV5E26x7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_E26x7[] = {
  {&(_ZTV5E26x7[6]),  6,12},
  {&(_ZTV5E26x7[11]),  11,12},
  {&(_tg__ZTV3C26__5E26x7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
Class_Descriptor cd_E26x7 = {  "E26x7", // class name
  bases_E26x7, 4,
  &(vtc_E26x7[0]), // expected_vtbl_contents
  &(vtt_E26x7[0]), // expected_vtt_contents
  ABISELECT(40,28), // object size
  NSPAIRA(_ZTI5E26x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E26x7),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E26x7),3, //virtual table table var
  1, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y0  : E26x7 , F1 {
  int ff;
  ~G26x7y0(); // tgen
  G26x7y0(); // tgen
};
//SIG(1 G26x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x7y0 ::~G26x7y0(){ note_dtor("G26x7y0", this);} // tgen
G26x7y0 ::G26x7y0(){ note_ctor("G26x7y0", this);} // tgen

static void Test_G26x7y0()
{
  extern Class_Descriptor cd_G26x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x7y0, buf);
    G26x7y0 *dp, &lv = *(dp=new (buf) G26x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y0)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x7y0");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x7y0");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(32,20), "G26x7y0");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(52,36), "G26x7y0");
    check_base_class_offset(lv, (E26x7*), 0, "G26x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G26x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G26x7y0.ff");
    test_class_info(&lv, &cd_G26x7y0);
    dp->~G26x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y0(Test_G26x7y0, "G26x7y0", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x7y0C1Ev();
extern void _ZN7G26x7y0D1Ev();
Name_Map name_map_G26x7y0[] = {
  NSPAIR(_ZN7G26x7y0C1Ev),
  NSPAIR(_ZN7G26x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G26x7y0[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y0[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y0[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y0[] = {
  {&(_ZTV7G26x7y0[6]),  6,15},
  {&(_tg__ZTV5E26x7__7G26x7y0[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y0[5]),  5,6},
  {&(_ZTV7G26x7y0[14]),  14,15},
  {&(_tg__ZTV3C26__7G26x7y0[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y0[];
extern  VTBL_ENTRY _ZTV7G26x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y0[];
Class_Descriptor cd_G26x7y0 = {  "G26x7y0", // class name
  bases_G26x7y0, 6,
  &(vtc_G26x7y0[0]), // expected_vtbl_contents
  &(vtt_G26x7y0[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y0),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y0),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y1  : virtual E26x7 , F1 {
  int ff;
  ~G26x7y1(); // tgen
  G26x7y1(); // tgen
};
//SIG(1 G26x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G26x7y1 ::~G26x7y1(){ note_dtor("G26x7y1", this);} // tgen
G26x7y1 ::G26x7y1(){ note_ctor("G26x7y1", this);} // tgen

static void Test_G26x7y1()
{
  extern Class_Descriptor cd_G26x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x7y1, buf);
    G26x7y1 *dp, &lv = *(dp=new (buf) G26x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y1)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x7y1");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x7y1");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(32,20), "G26x7y1");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(52,36), "G26x7y1");
    check_base_class_offset(lv, (E26x7*), ABISELECT(16,12), "G26x7y1");
    check_base_class_offset(lv, (F1*), 0, "G26x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x7y1.ff");
    test_class_info(&lv, &cd_G26x7y1);
    dp->~G26x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y1(Test_G26x7y1, "G26x7y1", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x7y1C1Ev();
extern void _ZN7G26x7y1D1Ev();
Name_Map name_map_G26x7y1[] = {
  NSPAIR(_ZN7G26x7y1C1Ev),
  NSPAIR(_ZN7G26x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x7y1[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G26x7y1[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y1[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y1[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y1[] = {
  {&(_ZTV7G26x7y1[7]),  7,20},
  {&(_ZTV7G26x7y1[14]),  14,20},
  {&(_ZTV7G26x7y1[19]),  19,20},
  {&(_tg__ZTV5E26x7__7G26x7y1[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y1[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x7y1[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y1[];
extern  VTBL_ENTRY _ZTV7G26x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y1[];
Class_Descriptor cd_G26x7y1 = {  "G26x7y1", // class name
  bases_G26x7y1, 6,
  &(vtc_G26x7y1[0]), // expected_vtbl_contents
  &(vtt_G26x7y1[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y1),20, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y1),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y2  : E26x7 , virtual F1 {
  int ff;
  ~G26x7y2(); // tgen
  G26x7y2(); // tgen
};
//SIG(1 G26x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x7y2 ::~G26x7y2(){ note_dtor("G26x7y2", this);} // tgen
G26x7y2 ::G26x7y2(){ note_ctor("G26x7y2", this);} // tgen

static void Test_G26x7y2()
{
  extern Class_Descriptor cd_G26x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x7y2, buf);
    G26x7y2 *dp, &lv = *(dp=new (buf) G26x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y2)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,20), "G26x7y2");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,24), "G26x7y2");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(16,12), "G26x7y2");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(36,28), "G26x7y2");
    check_base_class_offset(lv, (E26x7*), 0, "G26x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(40,32), "G26x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x7y2.ff");
    test_class_info(&lv, &cd_G26x7y2);
    dp->~G26x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y2(Test_G26x7y2, "G26x7y2", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x7y2C1Ev();
extern void _ZN7G26x7y2D1Ev();
Name_Map name_map_G26x7y2[] = {
  NSPAIR(_ZN7G26x7y2C1Ev),
  NSPAIR(_ZN7G26x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(40,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y2[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x7y2[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x7y2[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-40,-32),
  (VTBL_ENTRY)&(_ZTI7G26x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y2[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y2[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y2[] = {
  {&(_ZTV7G26x7y2[7]),  7,17},
  {&(_tg__ZTV5E26x7__7G26x7y2[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y2[5]),  5,6},
  {&(_ZTV7G26x7y2[12]),  12,17},
  {&(_ZTV7G26x7y2[16]),  16,17},
  {&(_tg__ZTV3C26__7G26x7y2[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y2[];
extern  VTBL_ENTRY _ZTV7G26x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y2[];
Class_Descriptor cd_G26x7y2 = {  "G26x7y2", // class name
  bases_G26x7y2, 6,
  &(vtc_G26x7y2[0]), // expected_vtbl_contents
  &(vtt_G26x7y2[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y2),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y2),6, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y3  : virtual E26x7 , virtual F1 {
  int ff;
  ~G26x7y3(); // tgen
  G26x7y3(); // tgen
};
//SIG(1 G26x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G26x7y3 ::~G26x7y3(){ note_dtor("G26x7y3", this);} // tgen
G26x7y3 ::G26x7y3(){ note_ctor("G26x7y3", this);} // tgen

static void Test_G26x7y3()
{
  extern Class_Descriptor cd_G26x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G26x7y3, buf);
    G26x7y3 *dp, &lv = *(dp=new (buf) G26x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G26x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y3)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,24), "G26x7y3");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,28), "G26x7y3");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(32,16), "G26x7y3");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(52,32), "G26x7y3");
    check_base_class_offset(lv, (E26x7*), ABISELECT(16,8), "G26x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G26x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x7y3.ff");
    test_class_info(&lv, &cd_G26x7y3);
    dp->~G26x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y3(Test_G26x7y3, "G26x7y3", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G26x7y3C1Ev();
extern void _ZN7G26x7y3D1Ev();
Name_Map name_map_G26x7y3[] = {
  NSPAIR(_ZN7G26x7y3C1Ev),
  NSPAIR(_ZN7G26x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G26x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y3[];
extern void _ZN3C263fooEv();
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G26x7y3[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y3[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G26x7y3[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G26x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y3[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y3[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y3[] = {
  {&(_ZTV7G26x7y3[8]),  8,24},
  {&(_ZTV7G26x7y3[14]),  14,24},
  {&(_ZTV7G26x7y3[19]),  19,24},
  {&(_ZTV7G26x7y3[23]),  23,24},
  {&(_tg__ZTV5E26x7__7G26x7y3[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y3[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x7y3[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y3[];
extern  VTBL_ENTRY _ZTV7G26x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y3[];
Class_Descriptor cd_G26x7y3 = {  "G26x7y3", // class name
  bases_G26x7y3, 6,
  &(vtc_G26x7y3[0]), // expected_vtbl_contents
  &(vtt_G26x7y3[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G26x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y3),24, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y3),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y4  : E26x7 , F0 {
  int ff;
  ~G26x7y4(); // tgen
  G26x7y4(); // tgen
};
//SIG(1 G26x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G26x7y4 ::~G26x7y4(){ note_dtor("G26x7y4", this);} // tgen
G26x7y4 ::G26x7y4(){ note_ctor("G26x7y4", this);} // tgen

static void Test_G26x7y4()
{
  extern Class_Descriptor cd_G26x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x7y4, buf);
    G26x7y4 *dp, &lv = *(dp=new (buf) G26x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y4)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(36,24), "G26x7y4");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(40,28), "G26x7y4");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(24,16), "G26x7y4");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(44,32), "G26x7y4");
    check_base_class_offset(lv, (E26x7*), 0, "G26x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G26x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G26x7y4.ff");
    test_class_info(&lv, &cd_G26x7y4);
    dp->~G26x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y4(Test_G26x7y4, "G26x7y4", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x7y4C1Ev();
extern void _ZN7G26x7y4D1Ev();
Name_Map name_map_G26x7y4[] = {
  NSPAIR(_ZN7G26x7y4C1Ev),
  NSPAIR(_ZN7G26x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(40,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y4[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G26x7y4[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y4[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y4[] = {
  ABISELECT(44,32),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y4[] = {
  {&(_ZTV7G26x7y4[6]),  6,12},
  {&(_tg__ZTV5E26x7__7G26x7y4[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y4[5]),  5,6},
  {&(_ZTV7G26x7y4[11]),  11,12},
  {&(_tg__ZTV3C26__7G26x7y4[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y4[];
extern  VTBL_ENTRY _ZTV7G26x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y4[];
Class_Descriptor cd_G26x7y4 = {  "G26x7y4", // class name
  bases_G26x7y4, 6,
  &(vtc_G26x7y4[0]), // expected_vtbl_contents
  &(vtt_G26x7y4[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y4),12, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y4),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y5  : virtual E26x7 , F0 {
  int ff;
  ~G26x7y5(); // tgen
  G26x7y5(); // tgen
};
//SIG(1 G26x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G26x7y5 ::~G26x7y5(){ note_dtor("G26x7y5", this);} // tgen
G26x7y5 ::G26x7y5(){ note_ctor("G26x7y5", this);} // tgen

static void Test_G26x7y5()
{
  extern Class_Descriptor cd_G26x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G26x7y5, buf);
    G26x7y5 *dp, &lv = *(dp=new (buf) G26x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G26x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y5)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,28), "G26x7y5");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,32), "G26x7y5");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(32,20), "G26x7y5");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(52,36), "G26x7y5");
    check_base_class_offset(lv, (E26x7*), ABISELECT(16,12), "G26x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G26x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x7y5.ff");
    test_class_info(&lv, &cd_G26x7y5);
    dp->~G26x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y5(Test_G26x7y5, "G26x7y5", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G26x7y5C1Ev();
extern void _ZN7G26x7y5D1Ev();
Name_Map name_map_G26x7y5[] = {
  NSPAIR(_ZN7G26x7y5C1Ev),
  NSPAIR(_ZN7G26x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y5[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x7y5[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y5[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G26x7y5[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y5[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y5[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y5[] = {
  {&(_ZTV7G26x7y5[7]),  7,19},
  {&(_ZTV7G26x7y5[13]),  13,19},
  {&(_ZTV7G26x7y5[18]),  18,19},
  {&(_tg__ZTV5E26x7__7G26x7y5[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y5[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x7y5[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y5[];
extern  VTBL_ENTRY _ZTV7G26x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y5[];
Class_Descriptor cd_G26x7y5 = {  "G26x7y5", // class name
  bases_G26x7y5, 6,
  &(vtc_G26x7y5[0]), // expected_vtbl_contents
  &(vtt_G26x7y5[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G26x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y5),19, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y5),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y6  : E26x7 , virtual F0 {
  int ff;
  ~G26x7y6(); // tgen
  G26x7y6(); // tgen
};
//SIG(1 G26x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x7y6 ::~G26x7y6(){ note_dtor("G26x7y6", this);} // tgen
G26x7y6 ::G26x7y6(){ note_ctor("G26x7y6", this);} // tgen

static void Test_G26x7y6()
{
  extern Class_Descriptor cd_G26x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,10)];
    init_test(&cd_G26x7y6, buf);
    G26x7y6 *dp, &lv = *(dp=new (buf) G26x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,36), "sizeof(G26x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y6)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(28,20), "G26x7y6");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(32,24), "G26x7y6");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(16,12), "G26x7y6");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(36,28), "G26x7y6");
    check_base_class_offset(lv, (E26x7*), 0, "G26x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(40,32), "G26x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G26x7y6.ff");
    test_class_info(&lv, &cd_G26x7y6);
    dp->~G26x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y6(Test_G26x7y6, "G26x7y6", ABISELECT(48,36));

#else // __cplusplus

extern void _ZN7G26x7y6C1Ev();
extern void _ZN7G26x7y6D1Ev();
Name_Map name_map_G26x7y6[] = {
  NSPAIR(_ZN7G26x7y6C1Ev),
  NSPAIR(_ZN7G26x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(32,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(36,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(40,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y6[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x7y6[] = {
  ABISELECT(40,32),
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G26x7y6[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y6[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y6[] = {
  ABISELECT(36,28),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y6[] = {
  {&(_ZTV7G26x7y6[7]),  7,13},
  {&(_tg__ZTV5E26x7__7G26x7y6[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y6[5]),  5,6},
  {&(_ZTV7G26x7y6[12]),  12,13},
  {&(_tg__ZTV3C26__7G26x7y6[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y6[];
extern  VTBL_ENTRY _ZTV7G26x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y6[];
Class_Descriptor cd_G26x7y6 = {  "G26x7y6", // class name
  bases_G26x7y6, 6,
  &(vtc_G26x7y6[0]), // expected_vtbl_contents
  &(vtt_G26x7y6[0]), // expected_vtt_contents
  ABISELECT(48,36), // object size
  NSPAIRA(_ZTI7G26x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y6),13, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y6),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G26x7y7  : virtual E26x7 , virtual F0 {
  int ff;
  ~G26x7y7(); // tgen
  G26x7y7(); // tgen
};
//SIG(1 G26x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G26x7y7 ::~G26x7y7(){ note_dtor("G26x7y7", this);} // tgen
G26x7y7 ::G26x7y7(){ note_ctor("G26x7y7", this);} // tgen

static void Test_G26x7y7()
{
  extern Class_Descriptor cd_G26x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G26x7y7, buf);
    G26x7y7 *dp, &lv = *(dp=new (buf) G26x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G26x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G26x7y7)");
    check_base_class_offset(lv, (A0*)(C26*), ABISELECT(44,24), "G26x7y7");
    check_base_class_offset(lv, (B0*)(C26*), ABISELECT(48,28), "G26x7y7");
    check_base_class_offset(lv, (C26*)(E26x7*), ABISELECT(32,16), "G26x7y7");
    check_base_class_offset(lv, (D0*)(E26x7*), ABISELECT(52,32), "G26x7y7");
    check_base_class_offset(lv, (E26x7*), ABISELECT(16,8), "G26x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(56,36), "G26x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G26x7y7.ff");
    test_class_info(&lv, &cd_G26x7y7);
    dp->~G26x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG26x7y7(Test_G26x7y7, "G26x7y7", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G26x7y7C1Ev();
extern void _ZN7G26x7y7D1Ev();
Name_Map name_map_G26x7y7[] = {
  NSPAIR(_ZN7G26x7y7C1Ev),
  NSPAIR(_ZN7G26x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C26;
extern VTBL_ENTRY _ZTI3C26[];
extern  VTBL_ENTRY _ZTV3C26[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C26[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E26x7;
extern VTBL_ENTRY _ZTI5E26x7[];
extern  VTBL_ENTRY _ZTV5E26x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E26x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G26x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C26,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E26x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G26x7y7[];
extern void _ZN3C263fooEv();
static  VTBL_ENTRY vtc_G26x7y7[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G26x7y7[0]),
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G26x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G26x7y7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern VTBL_ENTRY _ZTV7G26x7y7[];
static  VTBL_ENTRY _tg__ZTV5E26x7__7G26x7y7[] = {
  ABISELECT(36,24),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__5E26x7__7G26x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E26x7[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
extern void _ZN3C263fooEv();
static  VTBL_ENTRY _tg__ZTV3C26__7G26x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C26[0]),
  (VTBL_ENTRY)&_ZN3C263fooEv,
};
static  VTT_ENTRY vtt_G26x7y7[] = {
  {&(_ZTV7G26x7y7[8]),  8,20},
  {&(_ZTV7G26x7y7[14]),  14,20},
  {&(_ZTV7G26x7y7[19]),  19,20},
  {&(_tg__ZTV5E26x7__7G26x7y7[6]),  6,6},
  {&(_tg__ZTV3C26__5E26x7__7G26x7y7[5]),  5,6},
  {&(_tg__ZTV3C26__7G26x7y7[4]),  4,5},
};
extern VTBL_ENTRY _ZTI7G26x7y7[];
extern  VTBL_ENTRY _ZTV7G26x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G26x7y7[];
Class_Descriptor cd_G26x7y7 = {  "G26x7y7", // class name
  bases_G26x7y7, 6,
  &(vtc_G26x7y7[0]), // expected_vtbl_contents
  &(vtt_G26x7y7[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G26x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G26x7y7),20, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G26x7y7),6, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  0, // alt-thunk-names
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E27x7  : virtual C27 , virtual D0 {
  int fd;
  ~E27x7(); // tgen
  E27x7(); // tgen
};
//SIG(-1 E27x7) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ Fi} v1 Fi} VBC5{ Fi} Fi}


E27x7 ::~E27x7(){ note_dtor("E27x7", this);} // tgen
E27x7 ::E27x7(){ note_ctor("E27x7", this);} // tgen

static void Test_E27x7()
{
  extern Class_Descriptor cd_E27x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,9)];
    init_test(&cd_E27x7, buf);
    E27x7 *dp, &lv = *(dp=new (buf) E27x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,32), "sizeof(E27x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E27x7)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,16), "E27x7");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,24), "E27x7");
    check_base_class_offset(lv, (C27*), ABISELECT(16,8), "E27x7");
    check_base_class_offset(lv, (D0*), ABISELECT(48,28), "E27x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E27x7.fd");
    test_class_info(&lv, &cd_E27x7);
    dp->~E27x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE27x7(Test_E27x7, "E27x7", ABISELECT(56,32));

#else // __cplusplus

extern void _ZN5E27x7C1Ev();
extern void _ZN5E27x7D1Ev();
Name_Map name_map_E27x7[] = {
  NSPAIR(_ZN5E27x7C1Ev),
  NSPAIR(_ZN5E27x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E27x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(48,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E27x7[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E27x7[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV5E27x7[];
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__5E27x7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_E27x7[] = {
  {&(_ZTV5E27x7[6]),  6,16},
  {&(_ZTV5E27x7[11]),  11,16},
  {&(_ZTV5E27x7[15]),  15,16},
  {&(_tg__ZTV3C27__5E27x7[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__5E27x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
static VTBL_ENTRY alt_thunk_names215[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E27x7 = {  "E27x7", // class name
  bases_E27x7, 4,
  &(vtc_E27x7[0]), // expected_vtbl_contents
  &(vtt_E27x7[0]), // expected_vtt_contents
  ABISELECT(56,32), // object size
  NSPAIRA(_ZTI5E27x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E27x7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E27x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names215,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y0  : E27x7 , F1 {
  int ff;
  ~G27x7y0(); // tgen
  G27x7y0(); // tgen
};
//SIG(1 G27x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x7y0 ::~G27x7y0(){ note_dtor("G27x7y0", this);} // tgen
G27x7y0 ::G27x7y0(){ note_ctor("G27x7y0", this);} // tgen

static void Test_G27x7y0()
{
  extern Class_Descriptor cd_G27x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x7y0, buf);
    G27x7y0 *dp, &lv = *(dp=new (buf) G27x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y0)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x7y0");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x7y0");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(32,20), "G27x7y0");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(64,40), "G27x7y0");
    check_base_class_offset(lv, (E27x7*), 0, "G27x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G27x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G27x7y0.ff");
    test_class_info(&lv, &cd_G27x7y0);
    dp->~G27x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y0(Test_G27x7y0, "G27x7y0", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x7y0C1Ev();
extern void _ZN7G27x7y0D1Ev();
Name_Map name_map_G27x7y0[] = {
  NSPAIR(_ZN7G27x7y0C1Ev),
  NSPAIR(_ZN7G27x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x7y0[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G27x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x7y0[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y0[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y0[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y0[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y0[] = {
  {&(_ZTV7G27x7y0[6]),  6,19},
  {&(_tg__ZTV5E27x7__7G27x7y0[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y0[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y0[3]),  3,4},
  {&(_ZTV7G27x7y0[14]),  14,19},
  {&(_ZTV7G27x7y0[18]),  18,19},
  {&(_tg__ZTV3C27__7G27x7y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y0[];
extern  VTBL_ENTRY _ZTV7G27x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y0[];
static VTBL_ENTRY alt_thunk_names216[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y0 = {  "G27x7y0", // class name
  bases_G27x7y0, 6,
  &(vtc_G27x7y0[0]), // expected_vtbl_contents
  &(vtt_G27x7y0[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y0),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names216,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y1  : virtual E27x7 , F1 {
  int ff;
  ~G27x7y1(); // tgen
  G27x7y1(); // tgen
};
//SIG(1 G27x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G27x7y1 ::~G27x7y1(){ note_dtor("G27x7y1", this);} // tgen
G27x7y1 ::G27x7y1(){ note_ctor("G27x7y1", this);} // tgen

static void Test_G27x7y1()
{
  extern Class_Descriptor cd_G27x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x7y1, buf);
    G27x7y1 *dp, &lv = *(dp=new (buf) G27x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y1)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x7y1");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x7y1");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(32,20), "G27x7y1");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(64,40), "G27x7y1");
    check_base_class_offset(lv, (E27x7*), ABISELECT(16,12), "G27x7y1");
    check_base_class_offset(lv, (F1*), 0, "G27x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x7y1.ff");
    test_class_info(&lv, &cd_G27x7y1);
    dp->~G27x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y1(Test_G27x7y1, "G27x7y1", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x7y1C1Ev();
extern void _ZN7G27x7y1D1Ev();
Name_Map name_map_G27x7y1[] = {
  NSPAIR(_ZN7G27x7y1C1Ev),
  NSPAIR(_ZN7G27x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x7y1[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x7y1[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x7y1[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G27x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x7y1[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y1[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y1[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y1[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y1[] = {
  {&(_ZTV7G27x7y1[7]),  7,24},
  {&(_ZTV7G27x7y1[14]),  14,24},
  {&(_ZTV7G27x7y1[19]),  19,24},
  {&(_ZTV7G27x7y1[23]),  23,24},
  {&(_tg__ZTV5E27x7__7G27x7y1[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y1[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y1[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x7y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y1[];
extern  VTBL_ENTRY _ZTV7G27x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y1[];
static VTBL_ENTRY alt_thunk_names217[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y1 = {  "G27x7y1", // class name
  bases_G27x7y1, 6,
  &(vtc_G27x7y1[0]), // expected_vtbl_contents
  &(vtt_G27x7y1[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y1),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names217,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y2  : E27x7 , virtual F1 {
  int ff;
  ~G27x7y2(); // tgen
  G27x7y2(); // tgen
};
//SIG(1 G27x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x7y2 ::~G27x7y2(){ note_dtor("G27x7y2", this);} // tgen
G27x7y2 ::G27x7y2(){ note_ctor("G27x7y2", this);} // tgen

static void Test_G27x7y2()
{
  extern Class_Descriptor cd_G27x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x7y2, buf);
    G27x7y2 *dp, &lv = *(dp=new (buf) G27x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y2)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,20), "G27x7y2");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,28), "G27x7y2");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(16,12), "G27x7y2");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(48,32), "G27x7y2");
    check_base_class_offset(lv, (E27x7*), 0, "G27x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(56,36), "G27x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x7y2.ff");
    test_class_info(&lv, &cd_G27x7y2);
    dp->~G27x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y2(Test_G27x7y2, "G27x7y2", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x7y2C1Ev();
extern void _ZN7G27x7y2D1Ev();
Name_Map name_map_G27x7y2[] = {
  NSPAIR(_ZN7G27x7y2C1Ev),
  NSPAIR(_ZN7G27x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(56,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y2[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x7y2[] = {
  ABISELECT(56,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y2[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x7y2[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-56,-36),
  (VTBL_ENTRY)&(_ZTI7G27x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x7y2[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y2[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y2[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y2[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y2[] = {
  {&(_ZTV7G27x7y2[7]),  7,21},
  {&(_tg__ZTV5E27x7__7G27x7y2[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y2[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y2[3]),  3,4},
  {&(_ZTV7G27x7y2[12]),  12,21},
  {&(_ZTV7G27x7y2[16]),  16,21},
  {&(_ZTV7G27x7y2[20]),  20,21},
  {&(_tg__ZTV3C27__7G27x7y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y2[];
extern  VTBL_ENTRY _ZTV7G27x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y2[];
static VTBL_ENTRY alt_thunk_names218[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y2 = {  "G27x7y2", // class name
  bases_G27x7y2, 6,
  &(vtc_G27x7y2[0]), // expected_vtbl_contents
  &(vtt_G27x7y2[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y2),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names218,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y3  : virtual E27x7 , virtual F1 {
  int ff;
  ~G27x7y3(); // tgen
  G27x7y3(); // tgen
};
//SIG(1 G27x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G27x7y3 ::~G27x7y3(){ note_dtor("G27x7y3", this);} // tgen
G27x7y3 ::G27x7y3(){ note_ctor("G27x7y3", this);} // tgen

static void Test_G27x7y3()
{
  extern Class_Descriptor cd_G27x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G27x7y3, buf);
    G27x7y3 *dp, &lv = *(dp=new (buf) G27x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G27x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y3)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,24), "G27x7y3");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,32), "G27x7y3");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(32,16), "G27x7y3");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(64,36), "G27x7y3");
    check_base_class_offset(lv, (E27x7*), ABISELECT(16,8), "G27x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(72,40), "G27x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x7y3.ff");
    test_class_info(&lv, &cd_G27x7y3);
    dp->~G27x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y3(Test_G27x7y3, "G27x7y3", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G27x7y3C1Ev();
extern void _ZN7G27x7y3D1Ev();
Name_Map name_map_G27x7y3[] = {
  NSPAIR(_ZN7G27x7y3C1Ev),
  NSPAIR(_ZN7G27x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G27x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(72,40), //bcp->offset
    24, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y3[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G27x7y3[] = {
  ABISELECT(72,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y3[0]),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x7y3[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G27x7y3[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G27x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
  0,
  ABISELECT(-72,-40),
  (VTBL_ENTRY)&(_ZTI7G27x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G27x7y3[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y3[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y3[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y3[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y3[] = {
  {&(_ZTV7G27x7y3[8]),  8,28},
  {&(_ZTV7G27x7y3[14]),  14,28},
  {&(_ZTV7G27x7y3[19]),  19,28},
  {&(_ZTV7G27x7y3[23]),  23,28},
  {&(_ZTV7G27x7y3[27]),  27,28},
  {&(_tg__ZTV5E27x7__7G27x7y3[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y3[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y3[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x7y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y3[];
extern  VTBL_ENTRY _ZTV7G27x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y3[];
static VTBL_ENTRY alt_thunk_names219[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y3 = {  "G27x7y3", // class name
  bases_G27x7y3, 6,
  &(vtc_G27x7y3[0]), // expected_vtbl_contents
  &(vtt_G27x7y3[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G27x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y3),28, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names219,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y4  : E27x7 , F0 {
  int ff;
  ~G27x7y4(); // tgen
  G27x7y4(); // tgen
};
//SIG(1 G27x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G27x7y4 ::~G27x7y4(){ note_dtor("G27x7y4", this);} // tgen
G27x7y4 ::G27x7y4(){ note_ctor("G27x7y4", this);} // tgen

static void Test_G27x7y4()
{
  extern Class_Descriptor cd_G27x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,11)];
    init_test(&cd_G27x7y4, buf);
    G27x7y4 *dp, &lv = *(dp=new (buf) G27x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,40), "sizeof(G27x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y4)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(40,24), "G27x7y4");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(52,32), "G27x7y4");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(24,16), "G27x7y4");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(56,36), "G27x7y4");
    check_base_class_offset(lv, (E27x7*), 0, "G27x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G27x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G27x7y4.ff");
    test_class_info(&lv, &cd_G27x7y4);
    dp->~G27x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y4(Test_G27x7y4, "G27x7y4", ABISELECT(64,40));

#else // __cplusplus

extern void _ZN7G27x7y4C1Ev();
extern void _ZN7G27x7y4D1Ev();
Name_Map name_map_G27x7y4[] = {
  NSPAIR(_ZN7G27x7y4C1Ev),
  NSPAIR(_ZN7G27x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(52,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(56,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y4[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y4[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G27x7y4[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G27x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x7y4[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y4[] = {
  ABISELECT(56,36),
  ABISELECT(52,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y4[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y4[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y4[] = {
  {&(_ZTV7G27x7y4[6]),  6,16},
  {&(_tg__ZTV5E27x7__7G27x7y4[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y4[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y4[3]),  3,4},
  {&(_ZTV7G27x7y4[11]),  11,16},
  {&(_ZTV7G27x7y4[15]),  15,16},
  {&(_tg__ZTV3C27__7G27x7y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y4[];
extern  VTBL_ENTRY _ZTV7G27x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y4[];
static VTBL_ENTRY alt_thunk_names220[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y4 = {  "G27x7y4", // class name
  bases_G27x7y4, 6,
  &(vtc_G27x7y4[0]), // expected_vtbl_contents
  &(vtt_G27x7y4[0]), // expected_vtt_contents
  ABISELECT(64,40), // object size
  NSPAIRA(_ZTI7G27x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y4),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names220,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y5  : virtual E27x7 , F0 {
  int ff;
  ~G27x7y5(); // tgen
  G27x7y5(); // tgen
};
//SIG(1 G27x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G27x7y5 ::~G27x7y5(){ note_dtor("G27x7y5", this);} // tgen
G27x7y5 ::G27x7y5(){ note_ctor("G27x7y5", this);} // tgen

static void Test_G27x7y5()
{
  extern Class_Descriptor cd_G27x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x7y5, buf);
    G27x7y5 *dp, &lv = *(dp=new (buf) G27x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y5)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,28), "G27x7y5");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,36), "G27x7y5");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(32,20), "G27x7y5");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(64,40), "G27x7y5");
    check_base_class_offset(lv, (E27x7*), ABISELECT(16,12), "G27x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G27x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x7y5.ff");
    test_class_info(&lv, &cd_G27x7y5);
    dp->~G27x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y5(Test_G27x7y5, "G27x7y5", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x7y5C1Ev();
extern void _ZN7G27x7y5D1Ev();
Name_Map name_map_G27x7y5[] = {
  NSPAIR(_ZN7G27x7y5C1Ev),
  NSPAIR(_ZN7G27x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y5[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x7y5[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y5[0]),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x7y5[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x7y5[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G27x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x7y5[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y5[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y5[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y5[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y5[] = {
  {&(_ZTV7G27x7y5[7]),  7,23},
  {&(_ZTV7G27x7y5[13]),  13,23},
  {&(_ZTV7G27x7y5[18]),  18,23},
  {&(_ZTV7G27x7y5[22]),  22,23},
  {&(_tg__ZTV5E27x7__7G27x7y5[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y5[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y5[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x7y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y5[];
extern  VTBL_ENTRY _ZTV7G27x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y5[];
static VTBL_ENTRY alt_thunk_names221[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y5 = {  "G27x7y5", // class name
  bases_G27x7y5, 6,
  &(vtc_G27x7y5[0]), // expected_vtbl_contents
  &(vtt_G27x7y5[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y5),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names221,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y6  : E27x7 , virtual F0 {
  int ff;
  ~G27x7y6(); // tgen
  G27x7y6(); // tgen
};
//SIG(1 G27x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x7y6 ::~G27x7y6(){ note_dtor("G27x7y6", this);} // tgen
G27x7y6 ::G27x7y6(){ note_ctor("G27x7y6", this);} // tgen

static void Test_G27x7y6()
{
  extern Class_Descriptor cd_G27x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G27x7y6, buf);
    G27x7y6 *dp, &lv = *(dp=new (buf) G27x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G27x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y6)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(32,20), "G27x7y6");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(44,28), "G27x7y6");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(16,12), "G27x7y6");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(48,32), "G27x7y6");
    check_base_class_offset(lv, (E27x7*), 0, "G27x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(52,36), "G27x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G27x7y6.ff");
    test_class_info(&lv, &cd_G27x7y6);
    dp->~G27x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y6(Test_G27x7y6, "G27x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G27x7y6C1Ev();
extern void _ZN7G27x7y6D1Ev();
Name_Map name_map_G27x7y6[] = {
  NSPAIR(_ZN7G27x7y6C1Ev),
  NSPAIR(_ZN7G27x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(48,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y6[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x7y6[] = {
  ABISELECT(52,36),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y6[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G27x7y6[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G27x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x7y6[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y6[] = {
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y6[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y6[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y6[] = {
  {&(_ZTV7G27x7y6[7]),  7,17},
  {&(_tg__ZTV5E27x7__7G27x7y6[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y6[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y6[3]),  3,4},
  {&(_ZTV7G27x7y6[12]),  12,17},
  {&(_ZTV7G27x7y6[16]),  16,17},
  {&(_tg__ZTV3C27__7G27x7y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y6[];
extern  VTBL_ENTRY _ZTV7G27x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y6[];
static VTBL_ENTRY alt_thunk_names222[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y6 = {  "G27x7y6", // class name
  bases_G27x7y6, 6,
  &(vtc_G27x7y6[0]), // expected_vtbl_contents
  &(vtt_G27x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G27x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y6),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names222,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G27x7y7  : virtual E27x7 , virtual F0 {
  int ff;
  ~G27x7y7(); // tgen
  G27x7y7(); // tgen
};
//SIG(1 G27x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G27x7y7 ::~G27x7y7(){ note_dtor("G27x7y7", this);} // tgen
G27x7y7 ::G27x7y7(){ note_ctor("G27x7y7", this);} // tgen

static void Test_G27x7y7()
{
  extern Class_Descriptor cd_G27x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G27x7y7, buf);
    G27x7y7 *dp, &lv = *(dp=new (buf) G27x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G27x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G27x7y7)");
    check_base_class_offset(lv, (A1*)(C27*), ABISELECT(48,24), "G27x7y7");
    check_base_class_offset(lv, (B0*)(C27*), ABISELECT(60,32), "G27x7y7");
    check_base_class_offset(lv, (C27*)(E27x7*), ABISELECT(32,16), "G27x7y7");
    check_base_class_offset(lv, (D0*)(E27x7*), ABISELECT(64,36), "G27x7y7");
    check_base_class_offset(lv, (E27x7*), ABISELECT(16,8), "G27x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(68,40), "G27x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G27x7y7.ff");
    test_class_info(&lv, &cd_G27x7y7);
    dp->~G27x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG27x7y7(Test_G27x7y7, "G27x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G27x7y7C1Ev();
extern void _ZN7G27x7y7D1Ev();
Name_Map name_map_G27x7y7[] = {
  NSPAIR(_ZN7G27x7y7C1Ev),
  NSPAIR(_ZN7G27x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B0;
extern VTBL_ENTRY _ZTI2B0[];
extern Class_Descriptor cd_C27;
extern VTBL_ENTRY _ZTI3C27[];
extern  VTBL_ENTRY _ZTV3C27[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C27[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E27x7;
extern VTBL_ENTRY _ZTI5E27x7[];
extern  VTBL_ENTRY _ZTV5E27x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E27x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G27x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B0,    ABISELECT(60,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C27,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(64,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E27x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G27x7y7[];
extern void _ZN3C273fooEv();
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G27x7y7[] = {
  ABISELECT(68,40),
  ABISELECT(64,36),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G27x7y7[0]),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G27x7y7[0]),
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G27x7y7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G27x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern VTBL_ENTRY _ZTV7G27x7y7[];
static  VTBL_ENTRY _tg__ZTV5E27x7__7G27x7y7[] = {
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__5E27x7__7G27x7y7[] = {
  0,
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E27x7__7G27x7y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E27x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
extern void _ZN3C273fooEv();
static  VTBL_ENTRY _tg__ZTV3C27__7G27x7y7[] = {
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&_ZN3C273fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv)();
extern void ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C27__7G27x7y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C27[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv),
};
static  VTT_ENTRY vtt_G27x7y7[] = {
  {&(_ZTV7G27x7y7[8]),  8,24},
  {&(_ZTV7G27x7y7[14]),  14,24},
  {&(_ZTV7G27x7y7[19]),  19,24},
  {&(_ZTV7G27x7y7[23]),  23,24},
  {&(_tg__ZTV5E27x7__7G27x7y7[6]),  6,6},
  {&(_tg__ZTV3C27__5E27x7__7G27x7y7[5]),  5,6},
  {&(_tg__ZTV2A1__5E27x7__7G27x7y7[3]),  3,4},
  {&(_tg__ZTV3C27__7G27x7y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C27__7G27x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G27x7y7[];
extern  VTBL_ENTRY _ZTV7G27x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G27x7y7[];
static VTBL_ENTRY alt_thunk_names223[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C273fooEv,_ZTv0_n12_N3C273fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C273fooEv,_ZThn8_N3C273fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G27x7y7 = {  "G27x7y7", // class name
  bases_G27x7y7, 6,
  &(vtc_G27x7y7[0]), // expected_vtbl_contents
  &(vtt_G27x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G27x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G27x7y7),24, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G27x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names223,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E28x7  : virtual C28 , virtual D0 {
  int fd;
  ~E28x7(); // tgen
  E28x7(); // tgen
};
//SIG(-1 E28x7) C1{ VBC2{ BC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E28x7 ::~E28x7(){ note_dtor("E28x7", this);} // tgen
E28x7 ::E28x7(){ note_ctor("E28x7", this);} // tgen

static void Test_E28x7()
{
  extern Class_Descriptor cd_E28x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E28x7, buf);
    E28x7 *dp, &lv = *(dp=new (buf) E28x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E28x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E28x7)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,12), "E28x7");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,20), "E28x7");
    check_base_class_offset(lv, (C28*), ABISELECT(16,8), "E28x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E28x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E28x7.fd");
    test_class_info(&lv, &cd_E28x7);
    dp->~E28x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE28x7(Test_E28x7, "E28x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E28x7C1Ev();
extern void _ZN5E28x7D1Ev();
Name_Map name_map_E28x7[] = {
  NSPAIR(_ZN5E28x7C1Ev),
  NSPAIR(_ZN5E28x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E28x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E28x7[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E28x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV5E28x7[];
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__5E28x7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_E28x7[] = {
  {&(_ZTV5E28x7[5]),  5,14},
  {&(_ZTV5E28x7[9]),  9,14},
  {&(_ZTV5E28x7[13]),  13,14},
  {&(_tg__ZTV3C28__5E28x7[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__5E28x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
static VTBL_ENTRY alt_thunk_names224[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E28x7 = {  "E28x7", // class name
  bases_E28x7, 4,
  &(vtc_E28x7[0]), // expected_vtbl_contents
  &(vtt_E28x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E28x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E28x7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E28x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names224,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y0  : E28x7 , F1 {
  int ff;
  ~G28x7y0(); // tgen
  G28x7y0(); // tgen
};
//SIG(1 G28x7y0) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x7y0 ::~G28x7y0(){ note_dtor("G28x7y0", this);} // tgen
G28x7y0 ::G28x7y0(){ note_ctor("G28x7y0", this);} // tgen

static void Test_G28x7y0()
{
  extern Class_Descriptor cd_G28x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x7y0, buf);
    G28x7y0 *dp, &lv = *(dp=new (buf) G28x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y0)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x7y0");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x7y0");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(32,20), "G28x7y0");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(60,40), "G28x7y0");
    check_base_class_offset(lv, (E28x7*), 0, "G28x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G28x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G28x7y0.ff");
    test_class_info(&lv, &cd_G28x7y0);
    dp->~G28x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y0(Test_G28x7y0, "G28x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x7y0C1Ev();
extern void _ZN7G28x7y0D1Ev();
Name_Map name_map_G28x7y0[] = {
  NSPAIR(_ZN7G28x7y0C1Ev),
  NSPAIR(_ZN7G28x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G28x7y0[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G28x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x7y0[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y0[] = {
  {&(_ZTV7G28x7y0[5]),  5,17},
  {&(_tg__ZTV5E28x7__7G28x7y0[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y0[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y0[3]),  3,4},
  {&(_ZTV7G28x7y0[12]),  12,17},
  {&(_ZTV7G28x7y0[16]),  16,17},
  {&(_tg__ZTV3C28__7G28x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y0[];
extern  VTBL_ENTRY _ZTV7G28x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y0[];
static VTBL_ENTRY alt_thunk_names225[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y0 = {  "G28x7y0", // class name
  bases_G28x7y0, 6,
  &(vtc_G28x7y0[0]), // expected_vtbl_contents
  &(vtt_G28x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names225,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y1  : virtual E28x7 , F1 {
  int ff;
  ~G28x7y1(); // tgen
  G28x7y1(); // tgen
};
//SIG(1 G28x7y1) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G28x7y1 ::~G28x7y1(){ note_dtor("G28x7y1", this);} // tgen
G28x7y1 ::G28x7y1(){ note_ctor("G28x7y1", this);} // tgen

static void Test_G28x7y1()
{
  extern Class_Descriptor cd_G28x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x7y1, buf);
    G28x7y1 *dp, &lv = *(dp=new (buf) G28x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y1)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x7y1");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x7y1");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(32,20), "G28x7y1");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(60,40), "G28x7y1");
    check_base_class_offset(lv, (E28x7*), ABISELECT(16,12), "G28x7y1");
    check_base_class_offset(lv, (F1*), 0, "G28x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x7y1.ff");
    test_class_info(&lv, &cd_G28x7y1);
    dp->~G28x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y1(Test_G28x7y1, "G28x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x7y1C1Ev();
extern void _ZN7G28x7y1D1Ev();
Name_Map name_map_G28x7y1[] = {
  NSPAIR(_ZN7G28x7y1C1Ev),
  NSPAIR(_ZN7G28x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G28x7y1[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G28x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x7y1[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y1[] = {
  {&(_ZTV7G28x7y1[6]),  6,21},
  {&(_ZTV7G28x7y1[12]),  12,21},
  {&(_ZTV7G28x7y1[16]),  16,21},
  {&(_ZTV7G28x7y1[20]),  20,21},
  {&(_tg__ZTV5E28x7__7G28x7y1[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y1[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y1[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y1[];
extern  VTBL_ENTRY _ZTV7G28x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y1[];
static VTBL_ENTRY alt_thunk_names226[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y1 = {  "G28x7y1", // class name
  bases_G28x7y1, 6,
  &(vtc_G28x7y1[0]), // expected_vtbl_contents
  &(vtt_G28x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names226,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y2  : E28x7 , virtual F1 {
  int ff;
  ~G28x7y2(); // tgen
  G28x7y2(); // tgen
};
//SIG(1 G28x7y2) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x7y2 ::~G28x7y2(){ note_dtor("G28x7y2", this);} // tgen
G28x7y2 ::G28x7y2(){ note_ctor("G28x7y2", this);} // tgen

static void Test_G28x7y2()
{
  extern Class_Descriptor cd_G28x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x7y2, buf);
    G28x7y2 *dp, &lv = *(dp=new (buf) G28x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y2)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,16), "G28x7y2");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,24), "G28x7y2");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(16,12), "G28x7y2");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(44,32), "G28x7y2");
    check_base_class_offset(lv, (E28x7*), 0, "G28x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G28x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x7y2.ff");
    test_class_info(&lv, &cd_G28x7y2);
    dp->~G28x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y2(Test_G28x7y2, "G28x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x7y2C1Ev();
extern void _ZN7G28x7y2D1Ev();
Name_Map name_map_G28x7y2[] = {
  NSPAIR(_ZN7G28x7y2C1Ev),
  NSPAIR(_ZN7G28x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y2[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x7y2[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G28x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x7y2[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y2[] = {
  {&(_ZTV7G28x7y2[6]),  6,19},
  {&(_tg__ZTV5E28x7__7G28x7y2[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y2[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y2[3]),  3,4},
  {&(_ZTV7G28x7y2[10]),  10,19},
  {&(_ZTV7G28x7y2[14]),  14,19},
  {&(_ZTV7G28x7y2[18]),  18,19},
  {&(_tg__ZTV3C28__7G28x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y2[];
extern  VTBL_ENTRY _ZTV7G28x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y2[];
static VTBL_ENTRY alt_thunk_names227[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y2 = {  "G28x7y2", // class name
  bases_G28x7y2, 6,
  &(vtc_G28x7y2[0]), // expected_vtbl_contents
  &(vtt_G28x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names227,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y3  : virtual E28x7 , virtual F1 {
  int ff;
  ~G28x7y3(); // tgen
  G28x7y3(); // tgen
};
//SIG(1 G28x7y3) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G28x7y3 ::~G28x7y3(){ note_dtor("G28x7y3", this);} // tgen
G28x7y3 ::G28x7y3(){ note_ctor("G28x7y3", this);} // tgen

static void Test_G28x7y3()
{
  extern Class_Descriptor cd_G28x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G28x7y3, buf);
    G28x7y3 *dp, &lv = *(dp=new (buf) G28x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G28x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y3)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,20), "G28x7y3");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,28), "G28x7y3");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(32,16), "G28x7y3");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(60,36), "G28x7y3");
    check_base_class_offset(lv, (E28x7*), ABISELECT(16,8), "G28x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G28x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x7y3.ff");
    test_class_info(&lv, &cd_G28x7y3);
    dp->~G28x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y3(Test_G28x7y3, "G28x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G28x7y3C1Ev();
extern void _ZN7G28x7y3D1Ev();
Name_Map name_map_G28x7y3[] = {
  NSPAIR(_ZN7G28x7y3C1Ev),
  NSPAIR(_ZN7G28x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G28x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y3[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G28x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G28x7y3[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G28x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G28x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G28x7y3[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y3[] = {
  {&(_ZTV7G28x7y3[7]),  7,25},
  {&(_ZTV7G28x7y3[12]),  12,25},
  {&(_ZTV7G28x7y3[16]),  16,25},
  {&(_ZTV7G28x7y3[20]),  20,25},
  {&(_ZTV7G28x7y3[24]),  24,25},
  {&(_tg__ZTV5E28x7__7G28x7y3[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y3[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y3[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y3[];
extern  VTBL_ENTRY _ZTV7G28x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y3[];
static VTBL_ENTRY alt_thunk_names228[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y3 = {  "G28x7y3", // class name
  bases_G28x7y3, 6,
  &(vtc_G28x7y3[0]), // expected_vtbl_contents
  &(vtt_G28x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G28x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names228,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y4  : E28x7 , F0 {
  int ff;
  ~G28x7y4(); // tgen
  G28x7y4(); // tgen
};
//SIG(1 G28x7y4) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G28x7y4 ::~G28x7y4(){ note_dtor("G28x7y4", this);} // tgen
G28x7y4 ::G28x7y4(){ note_ctor("G28x7y4", this);} // tgen

static void Test_G28x7y4()
{
  extern Class_Descriptor cd_G28x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x7y4, buf);
    G28x7y4 *dp, &lv = *(dp=new (buf) G28x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y4)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(32,20), "G28x7y4");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(40,28), "G28x7y4");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(24,16), "G28x7y4");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(52,36), "G28x7y4");
    check_base_class_offset(lv, (E28x7*), 0, "G28x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G28x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G28x7y4.ff");
    test_class_info(&lv, &cd_G28x7y4);
    dp->~G28x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y4(Test_G28x7y4, "G28x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x7y4C1Ev();
extern void _ZN7G28x7y4D1Ev();
Name_Map name_map_G28x7y4[] = {
  NSPAIR(_ZN7G28x7y4C1Ev),
  NSPAIR(_ZN7G28x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y4[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G28x7y4[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G28x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x7y4[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y4[] = {
  {&(_ZTV7G28x7y4[5]),  5,14},
  {&(_tg__ZTV5E28x7__7G28x7y4[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y4[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y4[3]),  3,4},
  {&(_ZTV7G28x7y4[9]),  9,14},
  {&(_ZTV7G28x7y4[13]),  13,14},
  {&(_tg__ZTV3C28__7G28x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y4[];
extern  VTBL_ENTRY _ZTV7G28x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y4[];
static VTBL_ENTRY alt_thunk_names229[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y4 = {  "G28x7y4", // class name
  bases_G28x7y4, 6,
  &(vtc_G28x7y4[0]), // expected_vtbl_contents
  &(vtt_G28x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names229,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y5  : virtual E28x7 , F0 {
  int ff;
  ~G28x7y5(); // tgen
  G28x7y5(); // tgen
};
//SIG(1 G28x7y5) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G28x7y5 ::~G28x7y5(){ note_dtor("G28x7y5", this);} // tgen
G28x7y5 ::G28x7y5(){ note_ctor("G28x7y5", this);} // tgen

static void Test_G28x7y5()
{
  extern Class_Descriptor cd_G28x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G28x7y5, buf);
    G28x7y5 *dp, &lv = *(dp=new (buf) G28x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G28x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y5)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,24), "G28x7y5");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,32), "G28x7y5");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(32,20), "G28x7y5");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(60,40), "G28x7y5");
    check_base_class_offset(lv, (E28x7*), ABISELECT(16,12), "G28x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G28x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x7y5.ff");
    test_class_info(&lv, &cd_G28x7y5);
    dp->~G28x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y5(Test_G28x7y5, "G28x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G28x7y5C1Ev();
extern void _ZN7G28x7y5D1Ev();
Name_Map name_map_G28x7y5[] = {
  NSPAIR(_ZN7G28x7y5C1Ev),
  NSPAIR(_ZN7G28x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y5[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G28x7y5[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G28x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x7y5[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y5[] = {
  {&(_ZTV7G28x7y5[6]),  6,20},
  {&(_ZTV7G28x7y5[11]),  11,20},
  {&(_ZTV7G28x7y5[15]),  15,20},
  {&(_ZTV7G28x7y5[19]),  19,20},
  {&(_tg__ZTV5E28x7__7G28x7y5[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y5[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y5[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y5[];
extern  VTBL_ENTRY _ZTV7G28x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y5[];
static VTBL_ENTRY alt_thunk_names230[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y5 = {  "G28x7y5", // class name
  bases_G28x7y5, 6,
  &(vtc_G28x7y5[0]), // expected_vtbl_contents
  &(vtt_G28x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G28x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names230,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y6  : E28x7 , virtual F0 {
  int ff;
  ~G28x7y6(); // tgen
  G28x7y6(); // tgen
};
//SIG(1 G28x7y6) C1{ BC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x7y6 ::~G28x7y6(){ note_dtor("G28x7y6", this);} // tgen
G28x7y6 ::G28x7y6(){ note_ctor("G28x7y6", this);} // tgen

static void Test_G28x7y6()
{
  extern Class_Descriptor cd_G28x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G28x7y6, buf);
    G28x7y6 *dp, &lv = *(dp=new (buf) G28x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G28x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y6)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(24,16), "G28x7y6");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(32,24), "G28x7y6");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(16,12), "G28x7y6");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(44,32), "G28x7y6");
    check_base_class_offset(lv, (E28x7*), 0, "G28x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G28x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G28x7y6.ff");
    test_class_info(&lv, &cd_G28x7y6);
    dp->~G28x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y6(Test_G28x7y6, "G28x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G28x7y6C1Ev();
extern void _ZN7G28x7y6D1Ev();
Name_Map name_map_G28x7y6[] = {
  NSPAIR(_ZN7G28x7y6C1Ev),
  NSPAIR(_ZN7G28x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y6[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G28x7y6[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G28x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x7y6[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y6[] = {
  {&(_ZTV7G28x7y6[6]),  6,15},
  {&(_tg__ZTV5E28x7__7G28x7y6[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y6[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y6[3]),  3,4},
  {&(_ZTV7G28x7y6[10]),  10,15},
  {&(_ZTV7G28x7y6[14]),  14,15},
  {&(_tg__ZTV3C28__7G28x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y6[];
extern  VTBL_ENTRY _ZTV7G28x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y6[];
static VTBL_ENTRY alt_thunk_names231[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y6 = {  "G28x7y6", // class name
  bases_G28x7y6, 6,
  &(vtc_G28x7y6[0]), // expected_vtbl_contents
  &(vtt_G28x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G28x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names231,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G28x7y7  : virtual E28x7 , virtual F0 {
  int ff;
  ~G28x7y7(); // tgen
  G28x7y7(); // tgen
};
//SIG(1 G28x7y7) C1{ VBC2{ VBC3{ BC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G28x7y7 ::~G28x7y7(){ note_dtor("G28x7y7", this);} // tgen
G28x7y7 ::G28x7y7(){ note_ctor("G28x7y7", this);} // tgen

static void Test_G28x7y7()
{
  extern Class_Descriptor cd_G28x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G28x7y7, buf);
    G28x7y7 *dp, &lv = *(dp=new (buf) G28x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G28x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G28x7y7)");
    check_base_class_offset(lv, (A0*)(C28*), ABISELECT(40,20), "G28x7y7");
    check_base_class_offset(lv, (B1*)(C28*), ABISELECT(48,28), "G28x7y7");
    check_base_class_offset(lv, (C28*)(E28x7*), ABISELECT(32,16), "G28x7y7");
    check_base_class_offset(lv, (D0*)(E28x7*), ABISELECT(60,36), "G28x7y7");
    check_base_class_offset(lv, (E28x7*), ABISELECT(16,8), "G28x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G28x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G28x7y7.ff");
    test_class_info(&lv, &cd_G28x7y7);
    dp->~G28x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG28x7y7(Test_G28x7y7, "G28x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G28x7y7C1Ev();
extern void _ZN7G28x7y7D1Ev();
Name_Map name_map_G28x7y7[] = {
  NSPAIR(_ZN7G28x7y7C1Ev),
  NSPAIR(_ZN7G28x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C28;
extern VTBL_ENTRY _ZTI3C28[];
extern  VTBL_ENTRY _ZTV3C28[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C28[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E28x7;
extern VTBL_ENTRY _ZTI5E28x7[];
extern  VTBL_ENTRY _ZTV5E28x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E28x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G28x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(40,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C28,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E28x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G28x7y7[];
extern void _ZN3C283fooEv();
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G28x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G28x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G28x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G28x7y7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G28x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern VTBL_ENTRY _ZTV7G28x7y7[];
static  VTBL_ENTRY _tg__ZTV5E28x7__7G28x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__5E28x7__7G28x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E28x7__7G28x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E28x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
extern void _ZN3C283fooEv();
static  VTBL_ENTRY _tg__ZTV3C28__7G28x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&_ZN3C283fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv)();
extern void ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C28__7G28x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C28[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv),
};
static  VTT_ENTRY vtt_G28x7y7[] = {
  {&(_ZTV7G28x7y7[7]),  7,21},
  {&(_ZTV7G28x7y7[12]),  12,21},
  {&(_ZTV7G28x7y7[16]),  16,21},
  {&(_ZTV7G28x7y7[20]),  20,21},
  {&(_tg__ZTV5E28x7__7G28x7y7[5]),  5,5},
  {&(_tg__ZTV3C28__5E28x7__7G28x7y7[4]),  4,5},
  {&(_tg__ZTV2B1__5E28x7__7G28x7y7[3]),  3,4},
  {&(_tg__ZTV3C28__7G28x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C28__7G28x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G28x7y7[];
extern  VTBL_ENTRY _ZTV7G28x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G28x7y7[];
static VTBL_ENTRY alt_thunk_names232[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C283fooEv,_ZTv0_n12_N3C283fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C283fooEv,_ZThn12_N3C283fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G28x7y7 = {  "G28x7y7", // class name
  bases_G28x7y7, 6,
  &(vtc_G28x7y7[0]), // expected_vtbl_contents
  &(vtt_G28x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G28x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G28x7y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G28x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names232,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E29x7  : virtual C29 , virtual D0 {
  int fd;
  ~E29x7(); // tgen
  E29x7(); // tgen
};
//SIG(-1 E29x7) C1{ VBC2{ BC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E29x7 ::~E29x7(){ note_dtor("E29x7", this);} // tgen
E29x7 ::E29x7(){ note_ctor("E29x7", this);} // tgen

static void Test_E29x7()
{
  extern Class_Descriptor cd_E29x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E29x7, buf);
    E29x7 *dp, &lv = *(dp=new (buf) E29x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E29x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E29x7)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,8), "E29x7");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,20), "E29x7");
    check_base_class_offset(lv, (C29*), ABISELECT(16,8), "E29x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E29x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E29x7.fd");
    test_class_info(&lv, &cd_E29x7);
    dp->~E29x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE29x7(Test_E29x7, "E29x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E29x7C1Ev();
extern void _ZN5E29x7D1Ev();
Name_Map name_map_E29x7[] = {
  NSPAIR(_ZN5E29x7C1Ev),
  NSPAIR(_ZN5E29x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E29x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E29x7[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E29x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV5E29x7[];
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__5E29x7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_E29x7[] = {
  {&(_ZTV5E29x7[5]),  5,14},
  {&(_ZTV5E29x7[9]),  9,14},
  {&(_ZTV5E29x7[13]),  13,14},
  {&(_tg__ZTV3C29__5E29x7[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__5E29x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
static VTBL_ENTRY alt_thunk_names233[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E29x7 = {  "E29x7", // class name
  bases_E29x7, 4,
  &(vtc_E29x7[0]), // expected_vtbl_contents
  &(vtt_E29x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E29x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E29x7),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E29x7),5, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names233,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y0  : E29x7 , F1 {
  int ff;
  ~G29x7y0(); // tgen
  G29x7y0(); // tgen
};
//SIG(1 G29x7y0) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x7y0 ::~G29x7y0(){ note_dtor("G29x7y0", this);} // tgen
G29x7y0 ::G29x7y0(){ note_ctor("G29x7y0", this);} // tgen

static void Test_G29x7y0()
{
  extern Class_Descriptor cd_G29x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x7y0, buf);
    G29x7y0 *dp, &lv = *(dp=new (buf) G29x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y0)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x7y0");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x7y0");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(32,20), "G29x7y0");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(60,40), "G29x7y0");
    check_base_class_offset(lv, (E29x7*), 0, "G29x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G29x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G29x7y0.ff");
    test_class_info(&lv, &cd_G29x7y0);
    dp->~G29x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y0(Test_G29x7y0, "G29x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x7y0C1Ev();
extern void _ZN7G29x7y0D1Ev();
Name_Map name_map_G29x7y0[] = {
  NSPAIR(_ZN7G29x7y0C1Ev),
  NSPAIR(_ZN7G29x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,20), //bcp->offset
    8, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    5, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G29x7y0[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G29x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x7y0[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y0[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y0[] = {
  {&(_ZTV7G29x7y0[5]),  5,17},
  {&(_tg__ZTV5E29x7__7G29x7y0[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y0[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y0[3]),  3,4},
  {&(_ZTV7G29x7y0[12]),  12,17},
  {&(_ZTV7G29x7y0[16]),  16,17},
  {&(_tg__ZTV3C29__7G29x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y0[];
extern  VTBL_ENTRY _ZTV7G29x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y0[];
static VTBL_ENTRY alt_thunk_names234[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y0 = {  "G29x7y0", // class name
  bases_G29x7y0, 6,
  &(vtc_G29x7y0[0]), // expected_vtbl_contents
  &(vtt_G29x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y0),17, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y0),8, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names234,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y1  : virtual E29x7 , F1 {
  int ff;
  ~G29x7y1(); // tgen
  G29x7y1(); // tgen
};
//SIG(1 G29x7y1) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G29x7y1 ::~G29x7y1(){ note_dtor("G29x7y1", this);} // tgen
G29x7y1 ::G29x7y1(){ note_ctor("G29x7y1", this);} // tgen

static void Test_G29x7y1()
{
  extern Class_Descriptor cd_G29x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x7y1, buf);
    G29x7y1 *dp, &lv = *(dp=new (buf) G29x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y1)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x7y1");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x7y1");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(32,20), "G29x7y1");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(60,40), "G29x7y1");
    check_base_class_offset(lv, (E29x7*), ABISELECT(16,12), "G29x7y1");
    check_base_class_offset(lv, (F1*), 0, "G29x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x7y1.ff");
    test_class_info(&lv, &cd_G29x7y1);
    dp->~G29x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y1(Test_G29x7y1, "G29x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x7y1C1Ev();
extern void _ZN7G29x7y1D1Ev();
Name_Map name_map_G29x7y1[] = {
  NSPAIR(_ZN7G29x7y1C1Ev),
  NSPAIR(_ZN7G29x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G29x7y1[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G29x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x7y1[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y1[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y1[] = {
  {&(_ZTV7G29x7y1[6]),  6,21},
  {&(_ZTV7G29x7y1[12]),  12,21},
  {&(_ZTV7G29x7y1[16]),  16,21},
  {&(_ZTV7G29x7y1[20]),  20,21},
  {&(_tg__ZTV5E29x7__7G29x7y1[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y1[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y1[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y1[];
extern  VTBL_ENTRY _ZTV7G29x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y1[];
static VTBL_ENTRY alt_thunk_names235[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y1 = {  "G29x7y1", // class name
  bases_G29x7y1, 6,
  &(vtc_G29x7y1[0]), // expected_vtbl_contents
  &(vtt_G29x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y1),21, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y1),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names235,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y2  : E29x7 , virtual F1 {
  int ff;
  ~G29x7y2(); // tgen
  G29x7y2(); // tgen
};
//SIG(1 G29x7y2) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x7y2 ::~G29x7y2(){ note_dtor("G29x7y2", this);} // tgen
G29x7y2 ::G29x7y2(){ note_ctor("G29x7y2", this);} // tgen

static void Test_G29x7y2()
{
  extern Class_Descriptor cd_G29x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x7y2, buf);
    G29x7y2 *dp, &lv = *(dp=new (buf) G29x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y2)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,12), "G29x7y2");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,24), "G29x7y2");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(16,12), "G29x7y2");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(44,32), "G29x7y2");
    check_base_class_offset(lv, (E29x7*), 0, "G29x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G29x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x7y2.ff");
    test_class_info(&lv, &cd_G29x7y2);
    dp->~G29x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y2(Test_G29x7y2, "G29x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x7y2C1Ev();
extern void _ZN7G29x7y2D1Ev();
Name_Map name_map_G29x7y2[] = {
  NSPAIR(_ZN7G29x7y2C1Ev),
  NSPAIR(_ZN7G29x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y2[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x7y2[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G29x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x7y2[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y2[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y2[] = {
  {&(_ZTV7G29x7y2[6]),  6,19},
  {&(_tg__ZTV5E29x7__7G29x7y2[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y2[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y2[3]),  3,4},
  {&(_ZTV7G29x7y2[10]),  10,19},
  {&(_ZTV7G29x7y2[14]),  14,19},
  {&(_ZTV7G29x7y2[18]),  18,19},
  {&(_tg__ZTV3C29__7G29x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y2[];
extern  VTBL_ENTRY _ZTV7G29x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y2[];
static VTBL_ENTRY alt_thunk_names236[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y2 = {  "G29x7y2", // class name
  bases_G29x7y2, 6,
  &(vtc_G29x7y2[0]), // expected_vtbl_contents
  &(vtt_G29x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y2),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y2),9, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names236,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y3  : virtual E29x7 , virtual F1 {
  int ff;
  ~G29x7y3(); // tgen
  G29x7y3(); // tgen
};
//SIG(1 G29x7y3) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G29x7y3 ::~G29x7y3(){ note_dtor("G29x7y3", this);} // tgen
G29x7y3 ::G29x7y3(){ note_ctor("G29x7y3", this);} // tgen

static void Test_G29x7y3()
{
  extern Class_Descriptor cd_G29x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G29x7y3, buf);
    G29x7y3 *dp, &lv = *(dp=new (buf) G29x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G29x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y3)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,16), "G29x7y3");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,28), "G29x7y3");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(32,16), "G29x7y3");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(60,36), "G29x7y3");
    check_base_class_offset(lv, (E29x7*), ABISELECT(16,8), "G29x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G29x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x7y3.ff");
    test_class_info(&lv, &cd_G29x7y3);
    dp->~G29x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y3(Test_G29x7y3, "G29x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G29x7y3C1Ev();
extern void _ZN7G29x7y3D1Ev();
Name_Map name_map_G29x7y3[] = {
  NSPAIR(_ZN7G29x7y3C1Ev),
  NSPAIR(_ZN7G29x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G29x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y3[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G29x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G29x7y3[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G29x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G29x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G29x7y3[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y3[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y3[] = {
  {&(_ZTV7G29x7y3[7]),  7,25},
  {&(_ZTV7G29x7y3[12]),  12,25},
  {&(_ZTV7G29x7y3[16]),  16,25},
  {&(_ZTV7G29x7y3[20]),  20,25},
  {&(_ZTV7G29x7y3[24]),  24,25},
  {&(_tg__ZTV5E29x7__7G29x7y3[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y3[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y3[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y3[];
extern  VTBL_ENTRY _ZTV7G29x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y3[];
static VTBL_ENTRY alt_thunk_names237[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y3 = {  "G29x7y3", // class name
  bases_G29x7y3, 6,
  &(vtc_G29x7y3[0]), // expected_vtbl_contents
  &(vtt_G29x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G29x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y3),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y3),10, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names237,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y4  : E29x7 , F0 {
  int ff;
  ~G29x7y4(); // tgen
  G29x7y4(); // tgen
};
//SIG(1 G29x7y4) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G29x7y4 ::~G29x7y4(){ note_dtor("G29x7y4", this);} // tgen
G29x7y4 ::G29x7y4(){ note_ctor("G29x7y4", this);} // tgen

static void Test_G29x7y4()
{
  extern Class_Descriptor cd_G29x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x7y4, buf);
    G29x7y4 *dp, &lv = *(dp=new (buf) G29x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y4)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(24,16), "G29x7y4");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(40,28), "G29x7y4");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(24,16), "G29x7y4");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(52,36), "G29x7y4");
    check_base_class_offset(lv, (E29x7*), 0, "G29x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G29x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G29x7y4.ff");
    test_class_info(&lv, &cd_G29x7y4);
    dp->~G29x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y4(Test_G29x7y4, "G29x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x7y4C1Ev();
extern void _ZN7G29x7y4D1Ev();
Name_Map name_map_G29x7y4[] = {
  NSPAIR(_ZN7G29x7y4C1Ev),
  NSPAIR(_ZN7G29x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(24,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    10, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(24,16), //bcp->offset
    5, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y4[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G29x7y4[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G29x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x7y4[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y4[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y4[] = {
  {&(_ZTV7G29x7y4[5]),  5,14},
  {&(_tg__ZTV5E29x7__7G29x7y4[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y4[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y4[3]),  3,4},
  {&(_ZTV7G29x7y4[9]),  9,14},
  {&(_ZTV7G29x7y4[13]),  13,14},
  {&(_tg__ZTV3C29__7G29x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y4[];
extern  VTBL_ENTRY _ZTV7G29x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y4[];
static VTBL_ENTRY alt_thunk_names238[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y4 = {  "G29x7y4", // class name
  bases_G29x7y4, 6,
  &(vtc_G29x7y4[0]), // expected_vtbl_contents
  &(vtt_G29x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y4),14, //virtual function table var
  5, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y4),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names238,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y5  : virtual E29x7 , F0 {
  int ff;
  ~G29x7y5(); // tgen
  G29x7y5(); // tgen
};
//SIG(1 G29x7y5) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G29x7y5 ::~G29x7y5(){ note_dtor("G29x7y5", this);} // tgen
G29x7y5 ::G29x7y5(){ note_ctor("G29x7y5", this);} // tgen

static void Test_G29x7y5()
{
  extern Class_Descriptor cd_G29x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G29x7y5, buf);
    G29x7y5 *dp, &lv = *(dp=new (buf) G29x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G29x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y5)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,20), "G29x7y5");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,32), "G29x7y5");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(32,20), "G29x7y5");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(60,40), "G29x7y5");
    check_base_class_offset(lv, (E29x7*), ABISELECT(16,12), "G29x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G29x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x7y5.ff");
    test_class_info(&lv, &cd_G29x7y5);
    dp->~G29x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y5(Test_G29x7y5, "G29x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G29x7y5C1Ev();
extern void _ZN7G29x7y5D1Ev();
Name_Map name_map_G29x7y5[] = {
  NSPAIR(_ZN7G29x7y5C1Ev),
  NSPAIR(_ZN7G29x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,20), //bcp->offset
    11, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y5[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G29x7y5[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G29x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x7y5[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y5[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y5[] = {
  {&(_ZTV7G29x7y5[6]),  6,20},
  {&(_ZTV7G29x7y5[11]),  11,20},
  {&(_ZTV7G29x7y5[15]),  15,20},
  {&(_ZTV7G29x7y5[19]),  19,20},
  {&(_tg__ZTV5E29x7__7G29x7y5[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y5[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y5[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y5[];
extern  VTBL_ENTRY _ZTV7G29x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y5[];
static VTBL_ENTRY alt_thunk_names239[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y5 = {  "G29x7y5", // class name
  bases_G29x7y5, 6,
  &(vtc_G29x7y5[0]), // expected_vtbl_contents
  &(vtt_G29x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G29x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y5),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y5),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names239,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y6  : E29x7 , virtual F0 {
  int ff;
  ~G29x7y6(); // tgen
  G29x7y6(); // tgen
};
//SIG(1 G29x7y6) C1{ BC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x7y6 ::~G29x7y6(){ note_dtor("G29x7y6", this);} // tgen
G29x7y6 ::G29x7y6(){ note_ctor("G29x7y6", this);} // tgen

static void Test_G29x7y6()
{
  extern Class_Descriptor cd_G29x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G29x7y6, buf);
    G29x7y6 *dp, &lv = *(dp=new (buf) G29x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G29x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y6)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(16,12), "G29x7y6");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(32,24), "G29x7y6");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(16,12), "G29x7y6");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(44,32), "G29x7y6");
    check_base_class_offset(lv, (E29x7*), 0, "G29x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G29x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G29x7y6.ff");
    test_class_info(&lv, &cd_G29x7y6);
    dp->~G29x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y6(Test_G29x7y6, "G29x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G29x7y6C1Ev();
extern void _ZN7G29x7y6D1Ev();
Name_Map name_map_G29x7y6[] = {
  NSPAIR(_ZN7G29x7y6C1Ev),
  NSPAIR(_ZN7G29x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(16,12), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    11, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(16,12), //bcp->offset
    6, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y6[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G29x7y6[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G29x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x7y6[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y6[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y6[] = {
  {&(_ZTV7G29x7y6[6]),  6,15},
  {&(_tg__ZTV5E29x7__7G29x7y6[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y6[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y6[3]),  3,4},
  {&(_ZTV7G29x7y6[10]),  10,15},
  {&(_ZTV7G29x7y6[14]),  14,15},
  {&(_tg__ZTV3C29__7G29x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y6[];
extern  VTBL_ENTRY _ZTV7G29x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y6[];
static VTBL_ENTRY alt_thunk_names240[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y6 = {  "G29x7y6", // class name
  bases_G29x7y6, 6,
  &(vtc_G29x7y6[0]), // expected_vtbl_contents
  &(vtt_G29x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G29x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y6),15, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y6),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names240,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G29x7y7  : virtual E29x7 , virtual F0 {
  int ff;
  ~G29x7y7(); // tgen
  G29x7y7(); // tgen
};
//SIG(1 G29x7y7) C1{ VBC2{ VBC3{ BC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G29x7y7 ::~G29x7y7(){ note_dtor("G29x7y7", this);} // tgen
G29x7y7 ::G29x7y7(){ note_ctor("G29x7y7", this);} // tgen

static void Test_G29x7y7()
{
  extern Class_Descriptor cd_G29x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G29x7y7, buf);
    G29x7y7 *dp, &lv = *(dp=new (buf) G29x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G29x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G29x7y7)");
    check_base_class_offset(lv, (A1*)(C29*), ABISELECT(32,16), "G29x7y7");
    check_base_class_offset(lv, (B1*)(C29*), ABISELECT(48,28), "G29x7y7");
    check_base_class_offset(lv, (C29*)(E29x7*), ABISELECT(32,16), "G29x7y7");
    check_base_class_offset(lv, (D0*)(E29x7*), ABISELECT(60,36), "G29x7y7");
    check_base_class_offset(lv, (E29x7*), ABISELECT(16,8), "G29x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G29x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G29x7y7.ff");
    test_class_info(&lv, &cd_G29x7y7);
    dp->~G29x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG29x7y7(Test_G29x7y7, "G29x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G29x7y7C1Ev();
extern void _ZN7G29x7y7D1Ev();
Name_Map name_map_G29x7y7[] = {
  NSPAIR(_ZN7G29x7y7C1Ev),
  NSPAIR(_ZN7G29x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C29;
extern VTBL_ENTRY _ZTI3C29[];
extern  VTBL_ENTRY _ZTV3C29[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C29[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E29x7;
extern VTBL_ENTRY _ZTI5E29x7[];
extern  VTBL_ENTRY _ZTV5E29x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E29x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G29x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 0},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C29,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    4, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E29x7,    ABISELECT(16,8), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G29x7y7[];
extern void _ZN3C293fooEv();
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G29x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G29x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G29x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G29x7y7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G29x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern VTBL_ENTRY _ZTV7G29x7y7[];
static  VTBL_ENTRY _tg__ZTV5E29x7__7G29x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__5E29x7__7G29x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E29x7__7G29x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E29x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
extern void _ZN3C293fooEv();
static  VTBL_ENTRY _tg__ZTV3C29__7G29x7y7[] = {
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&_ZN3C293fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv)();
extern void ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C29__7G29x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C29[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv),
};
static  VTT_ENTRY vtt_G29x7y7[] = {
  {&(_ZTV7G29x7y7[7]),  7,21},
  {&(_ZTV7G29x7y7[12]),  12,21},
  {&(_ZTV7G29x7y7[16]),  16,21},
  {&(_ZTV7G29x7y7[20]),  20,21},
  {&(_tg__ZTV5E29x7__7G29x7y7[5]),  5,5},
  {&(_tg__ZTV3C29__5E29x7__7G29x7y7[4]),  4,5},
  {&(_tg__ZTV2B1__5E29x7__7G29x7y7[3]),  3,4},
  {&(_tg__ZTV3C29__7G29x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C29__7G29x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G29x7y7[];
extern  VTBL_ENTRY _ZTV7G29x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G29x7y7[];
static VTBL_ENTRY alt_thunk_names241[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C293fooEv,_ZTv0_n12_N3C293fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C293fooEv,_ZThn12_N3C293fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G29x7y7 = {  "G29x7y7", // class name
  bases_G29x7y7, 6,
  &(vtc_G29x7y7[0]), // expected_vtbl_contents
  &(vtt_G29x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G29x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G29x7y7),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G29x7y7),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names241,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E30x7  : virtual C30 , virtual D0 {
  int fd;
  ~E30x7(); // tgen
  E30x7(); // tgen
};
//SIG(-1 E30x7) C1{ VBC2{ VBC3{ Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E30x7 ::~E30x7(){ note_dtor("E30x7", this);} // tgen
E30x7 ::E30x7(){ note_ctor("E30x7", this);} // tgen

static void Test_E30x7()
{
  extern Class_Descriptor cd_E30x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(7,9)];
    init_test(&cd_E30x7, buf);
    E30x7 *dp, &lv = *(dp=new (buf) E30x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(48,32), "sizeof(E30x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E30x7)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,16), "E30x7");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,20), "E30x7");
    check_base_class_offset(lv, (C30*), ABISELECT(16,8), "E30x7");
    check_base_class_offset(lv, (D0*), ABISELECT(44,28), "E30x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E30x7.fd");
    test_class_info(&lv, &cd_E30x7);
    dp->~E30x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE30x7(Test_E30x7, "E30x7", ABISELECT(48,32));

#else // __cplusplus

extern void _ZN5E30x7C1Ev();
extern void _ZN5E30x7D1Ev();
Name_Map name_map_E30x7[] = {
  NSPAIR(_ZN5E30x7C1Ev),
  NSPAIR(_ZN5E30x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E30x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,16), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,20), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    4, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E30x7[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E30x7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV5E30x7[];
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__5E30x7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_E30x7[] = {
  {&(_ZTV5E30x7[6]),  6,16},
  {&(_ZTV5E30x7[11]),  11,16},
  {&(_ZTV5E30x7[15]),  15,16},
  {&(_tg__ZTV3C30__5E30x7[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__5E30x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
static VTBL_ENTRY alt_thunk_names242[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E30x7 = {  "E30x7", // class name
  bases_E30x7, 4,
  &(vtc_E30x7[0]), // expected_vtbl_contents
  &(vtt_E30x7[0]), // expected_vtt_contents
  ABISELECT(48,32), // object size
  NSPAIRA(_ZTI5E30x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E30x7),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E30x7),5, //virtual table table var
  2, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names242,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y0  : E30x7 , F1 {
  int ff;
  ~G30x7y0(); // tgen
  G30x7y0(); // tgen
};
//SIG(1 G30x7y0) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x7y0 ::~G30x7y0(){ note_dtor("G30x7y0", this);} // tgen
G30x7y0 ::G30x7y0(){ note_ctor("G30x7y0", this);} // tgen

static void Test_G30x7y0()
{
  extern Class_Descriptor cd_G30x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x7y0, buf);
    G30x7y0 *dp, &lv = *(dp=new (buf) G30x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y0)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x7y0");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x7y0");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(32,20), "G30x7y0");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(60,40), "G30x7y0");
    check_base_class_offset(lv, (E30x7*), 0, "G30x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G30x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G30x7y0.ff");
    test_class_info(&lv, &cd_G30x7y0);
    dp->~G30x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y0(Test_G30x7y0, "G30x7y0", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x7y0C1Ev();
extern void _ZN7G30x7y0D1Ev();
Name_Map name_map_G30x7y0[] = {
  NSPAIR(_ZN7G30x7y0C1Ev),
  NSPAIR(_ZN7G30x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G30x7y0[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x7y0[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y0[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y0[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y0[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y0[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y0[] = {
  {&(_ZTV7G30x7y0[6]),  6,19},
  {&(_tg__ZTV5E30x7__7G30x7y0[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y0[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y0[3]),  3,4},
  {&(_ZTV7G30x7y0[14]),  14,19},
  {&(_ZTV7G30x7y0[18]),  18,19},
  {&(_tg__ZTV3C30__7G30x7y0[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y0[];
extern  VTBL_ENTRY _ZTV7G30x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y0[];
static VTBL_ENTRY alt_thunk_names243[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y0 = {  "G30x7y0", // class name
  bases_G30x7y0, 6,
  &(vtc_G30x7y0[0]), // expected_vtbl_contents
  &(vtt_G30x7y0[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y0),19, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y0),8, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names243,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y1  : virtual E30x7 , F1 {
  int ff;
  ~G30x7y1(); // tgen
  G30x7y1(); // tgen
};
//SIG(1 G30x7y1) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G30x7y1 ::~G30x7y1(){ note_dtor("G30x7y1", this);} // tgen
G30x7y1 ::G30x7y1(){ note_ctor("G30x7y1", this);} // tgen

static void Test_G30x7y1()
{
  extern Class_Descriptor cd_G30x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x7y1, buf);
    G30x7y1 *dp, &lv = *(dp=new (buf) G30x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y1)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x7y1");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x7y1");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(32,20), "G30x7y1");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(60,40), "G30x7y1");
    check_base_class_offset(lv, (E30x7*), ABISELECT(16,12), "G30x7y1");
    check_base_class_offset(lv, (F1*), 0, "G30x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x7y1.ff");
    test_class_info(&lv, &cd_G30x7y1);
    dp->~G30x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y1(Test_G30x7y1, "G30x7y1", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x7y1C1Ev();
extern void _ZN7G30x7y1D1Ev();
Name_Map name_map_G30x7y1[] = {
  NSPAIR(_ZN7G30x7y1C1Ev),
  NSPAIR(_ZN7G30x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x7y1[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x7y1[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G30x7y1[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x7y1[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y1[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y1[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y1[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y1[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y1[] = {
  {&(_ZTV7G30x7y1[7]),  7,24},
  {&(_ZTV7G30x7y1[14]),  14,24},
  {&(_ZTV7G30x7y1[19]),  19,24},
  {&(_ZTV7G30x7y1[23]),  23,24},
  {&(_tg__ZTV5E30x7__7G30x7y1[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y1[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y1[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x7y1[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y1[];
extern  VTBL_ENTRY _ZTV7G30x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y1[];
static VTBL_ENTRY alt_thunk_names244[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y1 = {  "G30x7y1", // class name
  bases_G30x7y1, 6,
  &(vtc_G30x7y1[0]), // expected_vtbl_contents
  &(vtt_G30x7y1[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y1),24, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y1),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names244,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y2  : E30x7 , virtual F1 {
  int ff;
  ~G30x7y2(); // tgen
  G30x7y2(); // tgen
};
//SIG(1 G30x7y2) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x7y2 ::~G30x7y2(){ note_dtor("G30x7y2", this);} // tgen
G30x7y2 ::G30x7y2(){ note_ctor("G30x7y2", this);} // tgen

static void Test_G30x7y2()
{
  extern Class_Descriptor cd_G30x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x7y2, buf);
    G30x7y2 *dp, &lv = *(dp=new (buf) G30x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y2)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,20), "G30x7y2");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,24), "G30x7y2");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(16,12), "G30x7y2");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(44,32), "G30x7y2");
    check_base_class_offset(lv, (E30x7*), 0, "G30x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(48,36), "G30x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x7y2.ff");
    test_class_info(&lv, &cd_G30x7y2);
    dp->~G30x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y2(Test_G30x7y2, "G30x7y2", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x7y2C1Ev();
extern void _ZN7G30x7y2D1Ev();
Name_Map name_map_G30x7y2[] = {
  NSPAIR(_ZN7G30x7y2C1Ev),
  NSPAIR(_ZN7G30x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(48,36), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y2[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x7y2[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y2[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x7y2[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-48,-36),
  (VTBL_ENTRY)&(_ZTI7G30x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x7y2[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y2[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y2[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y2[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y2[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y2[] = {
  {&(_ZTV7G30x7y2[7]),  7,21},
  {&(_tg__ZTV5E30x7__7G30x7y2[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y2[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y2[3]),  3,4},
  {&(_ZTV7G30x7y2[12]),  12,21},
  {&(_ZTV7G30x7y2[16]),  16,21},
  {&(_ZTV7G30x7y2[20]),  20,21},
  {&(_tg__ZTV3C30__7G30x7y2[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y2[];
extern  VTBL_ENTRY _ZTV7G30x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y2[];
static VTBL_ENTRY alt_thunk_names245[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y2 = {  "G30x7y2", // class name
  bases_G30x7y2, 6,
  &(vtc_G30x7y2[0]), // expected_vtbl_contents
  &(vtt_G30x7y2[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y2),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y2),9, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names245,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y3  : virtual E30x7 , virtual F1 {
  int ff;
  ~G30x7y3(); // tgen
  G30x7y3(); // tgen
};
//SIG(1 G30x7y3) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G30x7y3 ::~G30x7y3(){ note_dtor("G30x7y3", this);} // tgen
G30x7y3 ::G30x7y3(){ note_ctor("G30x7y3", this);} // tgen

static void Test_G30x7y3()
{
  extern Class_Descriptor cd_G30x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G30x7y3, buf);
    G30x7y3 *dp, &lv = *(dp=new (buf) G30x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G30x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y3)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,24), "G30x7y3");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,28), "G30x7y3");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(32,16), "G30x7y3");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(60,36), "G30x7y3");
    check_base_class_offset(lv, (E30x7*), ABISELECT(16,8), "G30x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G30x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x7y3.ff");
    test_class_info(&lv, &cd_G30x7y3);
    dp->~G30x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y3(Test_G30x7y3, "G30x7y3", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G30x7y3C1Ev();
extern void _ZN7G30x7y3D1Ev();
Name_Map name_map_G30x7y3[] = {
  NSPAIR(_ZN7G30x7y3C1Ev),
  NSPAIR(_ZN7G30x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G30x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    24, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y3[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G30x7y3[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y3[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x7y3[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G30x7y3[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G30x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G30x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G30x7y3[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y3[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y3[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y3[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y3[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y3[] = {
  {&(_ZTV7G30x7y3[8]),  8,28},
  {&(_ZTV7G30x7y3[14]),  14,28},
  {&(_ZTV7G30x7y3[19]),  19,28},
  {&(_ZTV7G30x7y3[23]),  23,28},
  {&(_ZTV7G30x7y3[27]),  27,28},
  {&(_tg__ZTV5E30x7__7G30x7y3[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y3[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y3[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x7y3[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y3[];
extern  VTBL_ENTRY _ZTV7G30x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y3[];
static VTBL_ENTRY alt_thunk_names246[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y3 = {  "G30x7y3", // class name
  bases_G30x7y3, 6,
  &(vtc_G30x7y3[0]), // expected_vtbl_contents
  &(vtt_G30x7y3[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G30x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y3),28, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y3),10, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names246,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y4  : E30x7 , F0 {
  int ff;
  ~G30x7y4(); // tgen
  G30x7y4(); // tgen
};
//SIG(1 G30x7y4) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G30x7y4 ::~G30x7y4(){ note_dtor("G30x7y4", this);} // tgen
G30x7y4 ::G30x7y4(){ note_ctor("G30x7y4", this);} // tgen

static void Test_G30x7y4()
{
  extern Class_Descriptor cd_G30x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x7y4, buf);
    G30x7y4 *dp, &lv = *(dp=new (buf) G30x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y4)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(36,24), "G30x7y4");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(40,28), "G30x7y4");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(24,16), "G30x7y4");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(52,36), "G30x7y4");
    check_base_class_offset(lv, (E30x7*), 0, "G30x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G30x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G30x7y4.ff");
    test_class_info(&lv, &cd_G30x7y4);
    dp->~G30x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y4(Test_G30x7y4, "G30x7y4", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x7y4C1Ev();
extern void _ZN7G30x7y4D1Ev();
Name_Map name_map_G30x7y4[] = {
  NSPAIR(_ZN7G30x7y4C1Ev),
  NSPAIR(_ZN7G30x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(36,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(40,28), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(52,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y4[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y4[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G30x7y4[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI7G30x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x7y4[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y4[] = {
  ABISELECT(52,36),
  ABISELECT(40,28),
  ABISELECT(36,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y4[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-40,-28),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y4[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y4[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y4[] = {
  {&(_ZTV7G30x7y4[6]),  6,16},
  {&(_tg__ZTV5E30x7__7G30x7y4[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y4[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y4[3]),  3,4},
  {&(_ZTV7G30x7y4[11]),  11,16},
  {&(_ZTV7G30x7y4[15]),  15,16},
  {&(_tg__ZTV3C30__7G30x7y4[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y4[];
extern  VTBL_ENTRY _ZTV7G30x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y4[];
static VTBL_ENTRY alt_thunk_names247[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y4 = {  "G30x7y4", // class name
  bases_G30x7y4, 6,
  &(vtc_G30x7y4[0]), // expected_vtbl_contents
  &(vtt_G30x7y4[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y4),16, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y4),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names247,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y5  : virtual E30x7 , F0 {
  int ff;
  ~G30x7y5(); // tgen
  G30x7y5(); // tgen
};
//SIG(1 G30x7y5) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G30x7y5 ::~G30x7y5(){ note_dtor("G30x7y5", this);} // tgen
G30x7y5 ::G30x7y5(){ note_ctor("G30x7y5", this);} // tgen

static void Test_G30x7y5()
{
  extern Class_Descriptor cd_G30x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,12)];
    init_test(&cd_G30x7y5, buf);
    G30x7y5 *dp, &lv = *(dp=new (buf) G30x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,44), "sizeof(G30x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y5)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,28), "G30x7y5");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,32), "G30x7y5");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(32,20), "G30x7y5");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(60,40), "G30x7y5");
    check_base_class_offset(lv, (E30x7*), ABISELECT(16,12), "G30x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G30x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x7y5.ff");
    test_class_info(&lv, &cd_G30x7y5);
    dp->~G30x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y5(Test_G30x7y5, "G30x7y5", ABISELECT(64,44));

#else // __cplusplus

extern void _ZN7G30x7y5C1Ev();
extern void _ZN7G30x7y5D1Ev();
Name_Map name_map_G30x7y5[] = {
  NSPAIR(_ZN7G30x7y5C1Ev),
  NSPAIR(_ZN7G30x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,28), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,32), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y5[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x7y5[] = {
  ABISELECT(60,40),
  ABISELECT(48,32),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y5[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x7y5[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G30x7y5[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-32),
  (VTBL_ENTRY)&(_ZTI7G30x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x7y5[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y5[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y5[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y5[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y5[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y5[] = {
  {&(_ZTV7G30x7y5[7]),  7,23},
  {&(_ZTV7G30x7y5[13]),  13,23},
  {&(_ZTV7G30x7y5[18]),  18,23},
  {&(_ZTV7G30x7y5[22]),  22,23},
  {&(_tg__ZTV5E30x7__7G30x7y5[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y5[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y5[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x7y5[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y5[];
extern  VTBL_ENTRY _ZTV7G30x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y5[];
static VTBL_ENTRY alt_thunk_names248[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y5 = {  "G30x7y5", // class name
  bases_G30x7y5, 6,
  &(vtc_G30x7y5[0]), // expected_vtbl_contents
  &(vtt_G30x7y5[0]), // expected_vtt_contents
  ABISELECT(64,44), // object size
  NSPAIRA(_ZTI7G30x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y5),23, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y5),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names248,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y6  : E30x7 , virtual F0 {
  int ff;
  ~G30x7y6(); // tgen
  G30x7y6(); // tgen
};
//SIG(1 G30x7y6) C1{ BC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x7y6 ::~G30x7y6(){ note_dtor("G30x7y6", this);} // tgen
G30x7y6 ::G30x7y6(){ note_ctor("G30x7y6", this);} // tgen

static void Test_G30x7y6()
{
  extern Class_Descriptor cd_G30x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(8,11)];
    init_test(&cd_G30x7y6, buf);
    G30x7y6 *dp, &lv = *(dp=new (buf) G30x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(56,40), "sizeof(G30x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y6)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(28,20), "G30x7y6");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(32,24), "G30x7y6");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(16,12), "G30x7y6");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(44,32), "G30x7y6");
    check_base_class_offset(lv, (E30x7*), 0, "G30x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(48,36), "G30x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G30x7y6.ff");
    test_class_info(&lv, &cd_G30x7y6);
    dp->~G30x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y6(Test_G30x7y6, "G30x7y6", ABISELECT(56,40));

#else // __cplusplus

extern void _ZN7G30x7y6C1Ev();
extern void _ZN7G30x7y6D1Ev();
Name_Map name_map_G30x7y6[] = {
  NSPAIR(_ZN7G30x7y6C1Ev),
  NSPAIR(_ZN7G30x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(28,20), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(32,24), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(44,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(48,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y6[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x7y6[] = {
  ABISELECT(48,36),
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y6[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G30x7y6[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI7G30x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x7y6[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y6[] = {
  ABISELECT(44,32),
  ABISELECT(32,24),
  ABISELECT(28,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y6[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-24),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y6[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y6[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y6[] = {
  {&(_ZTV7G30x7y6[7]),  7,17},
  {&(_tg__ZTV5E30x7__7G30x7y6[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y6[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y6[3]),  3,4},
  {&(_ZTV7G30x7y6[12]),  12,17},
  {&(_ZTV7G30x7y6[16]),  16,17},
  {&(_tg__ZTV3C30__7G30x7y6[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y6[];
extern  VTBL_ENTRY _ZTV7G30x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y6[];
static VTBL_ENTRY alt_thunk_names249[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y6 = {  "G30x7y6", // class name
  bases_G30x7y6, 6,
  &(vtc_G30x7y6[0]), // expected_vtbl_contents
  &(vtt_G30x7y6[0]), // expected_vtt_contents
  ABISELECT(56,40), // object size
  NSPAIRA(_ZTI7G30x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y6),17, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y6),8, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names249,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G30x7y7  : virtual E30x7 , virtual F0 {
  int ff;
  ~G30x7y7(); // tgen
  G30x7y7(); // tgen
};
//SIG(1 G30x7y7) C1{ VBC2{ VBC3{ VBC4{ Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G30x7y7 ::~G30x7y7(){ note_dtor("G30x7y7", this);} // tgen
G30x7y7 ::G30x7y7(){ note_ctor("G30x7y7", this);} // tgen

static void Test_G30x7y7()
{
  extern Class_Descriptor cd_G30x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G30x7y7, buf);
    G30x7y7 *dp, &lv = *(dp=new (buf) G30x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G30x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G30x7y7)");
    check_base_class_offset(lv, (A0*)(C30*), ABISELECT(44,24), "G30x7y7");
    check_base_class_offset(lv, (B1*)(C30*), ABISELECT(48,28), "G30x7y7");
    check_base_class_offset(lv, (C30*)(E30x7*), ABISELECT(32,16), "G30x7y7");
    check_base_class_offset(lv, (D0*)(E30x7*), ABISELECT(60,36), "G30x7y7");
    check_base_class_offset(lv, (E30x7*), ABISELECT(16,8), "G30x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G30x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G30x7y7.ff");
    test_class_info(&lv, &cd_G30x7y7);
    dp->~G30x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG30x7y7(Test_G30x7y7, "G30x7y7", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G30x7y7C1Ev();
extern void _ZN7G30x7y7D1Ev();
Name_Map name_map_G30x7y7[] = {
  NSPAIR(_ZN7G30x7y7C1Ev),
  NSPAIR(_ZN7G30x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A0;
extern VTBL_ENTRY _ZTI2A0[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C30;
extern VTBL_ENTRY _ZTI3C30[];
extern  VTBL_ENTRY _ZTV3C30[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C30[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E30x7;
extern VTBL_ENTRY _ZTI5E30x7[];
extern  VTBL_ENTRY _ZTV5E30x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E30x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G30x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A0,    ABISELECT(44,24), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C30,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    8, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E30x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G30x7y7[];
extern void _ZN3C303fooEv();
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G30x7y7[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(44,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G30x7y7[0]),
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G30x7y7[0]),
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G30x7y7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
  ABISELECT(-16,-12),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G30x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern VTBL_ENTRY _ZTV7G30x7y7[];
static  VTBL_ENTRY _tg__ZTV5E30x7__7G30x7y7[] = {
  ABISELECT(44,28),
  ABISELECT(32,20),
  ABISELECT(28,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__5E30x7__7G30x7y7[] = {
  0,
  ABISELECT(16,12),
  ABISELECT(12,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E30x7__7G30x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E30x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
extern void _ZN3C303fooEv();
static  VTBL_ENTRY _tg__ZTV3C30__7G30x7y7[] = {
  ABISELECT(16,12),
  ABISELECT(12,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&_ZN3C303fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv)();
extern void ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C30__7G30x7y7[] = {
  ABISELECT(-16,-12),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI3C30[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv),
};
static  VTT_ENTRY vtt_G30x7y7[] = {
  {&(_ZTV7G30x7y7[8]),  8,24},
  {&(_ZTV7G30x7y7[14]),  14,24},
  {&(_ZTV7G30x7y7[19]),  19,24},
  {&(_ZTV7G30x7y7[23]),  23,24},
  {&(_tg__ZTV5E30x7__7G30x7y7[6]),  6,6},
  {&(_tg__ZTV3C30__5E30x7__7G30x7y7[5]),  5,6},
  {&(_tg__ZTV2B1__5E30x7__7G30x7y7[3]),  3,4},
  {&(_tg__ZTV3C30__7G30x7y7[4]),  4,5},
  {&(_tg__ZTV2B1__3C30__7G30x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G30x7y7[];
extern  VTBL_ENTRY _ZTV7G30x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G30x7y7[];
static VTBL_ENTRY alt_thunk_names250[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C303fooEv,_ZTv0_n12_N3C303fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C303fooEv,_ZThn12_N3C303fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G30x7y7 = {  "G30x7y7", // class name
  bases_G30x7y7, 6,
  &(vtc_G30x7y7[0]), // expected_vtbl_contents
  &(vtt_G30x7y7[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G30x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G30x7y7),24, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G30x7y7),9, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names250,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  E31x7  : virtual C31 , virtual D0 {
  int fd;
  ~E31x7(); // tgen
  E31x7(); // tgen
};
//SIG(-1 E31x7) C1{ VBC2{ VBC3{ v1 Fi} VBC4{ v1 Fi} v1 Fi} VBC5{ Fi} Fi}


E31x7 ::~E31x7(){ note_dtor("E31x7", this);} // tgen
E31x7 ::E31x7(){ note_ctor("E31x7", this);} // tgen

static void Test_E31x7()
{
  extern Class_Descriptor cd_E31x7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(9,10)];
    init_test(&cd_E31x7, buf);
    E31x7 *dp, &lv = *(dp=new (buf) E31x7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(64,36), "sizeof(E31x7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(E31x7)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,16), "E31x7");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,24), "E31x7");
    check_base_class_offset(lv, (C31*), ABISELECT(16,8), "E31x7");
    check_base_class_offset(lv, (D0*), ABISELECT(60,32), "E31x7");
    check_field_offset(lv, fd, ABISELECT(8,4), "E31x7.fd");
    test_class_info(&lv, &cd_E31x7);
    dp->~E31x7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vE31x7(Test_E31x7, "E31x7", ABISELECT(64,36));

#else // __cplusplus

extern void _ZN5E31x7C1Ev();
extern void _ZN5E31x7D1Ev();
Name_Map name_map_E31x7[] = {
  NSPAIR(_ZN5E31x7C1Ev),
  NSPAIR(_ZN5E31x7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
static Base_Class bases_E31x7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,16), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,24), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    5, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_D0,    ABISELECT(60,32), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI5E31x7[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_E31x7[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV5E31x7[];
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__5E31x7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__5E31x7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_E31x7[] = {
  {&(_ZTV5E31x7[6]),  6,20},
  {&(_ZTV5E31x7[11]),  11,20},
  {&(_ZTV5E31x7[15]),  15,20},
  {&(_ZTV5E31x7[19]),  19,20},
  {&(_tg__ZTV3C31__5E31x7[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__5E31x7[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__5E31x7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
static VTBL_ENTRY alt_thunk_names251[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_E31x7 = {  "E31x7", // class name
  bases_E31x7, 4,
  &(vtc_E31x7[0]), // expected_vtbl_contents
  &(vtt_E31x7[0]), // expected_vtt_contents
  ABISELECT(64,36), // object size
  NSPAIRA(_ZTI5E31x7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV5E31x7),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT5E31x7),7, //virtual table table var
  3, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names251,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y0  : E31x7 , F1 {
  int ff;
  ~G31x7y0(); // tgen
  G31x7y0(); // tgen
};
//SIG(1 G31x7y0) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x7y0 ::~G31x7y0(){ note_dtor("G31x7y0", this);} // tgen
G31x7y0 ::G31x7y0(){ note_ctor("G31x7y0", this);} // tgen

static void Test_G31x7y0()
{
  extern Class_Descriptor cd_G31x7y0;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x7y0, buf);
    G31x7y0 *dp, &lv = *(dp=new (buf) G31x7y0());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x7y0)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y0)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x7y0");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x7y0");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(32,20), "G31x7y0");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(76,44), "G31x7y0");
    check_base_class_offset(lv, (E31x7*), 0, "G31x7y0");
    check_base_class_offset(lv, (F1*), ABISELECT(16,8), "G31x7y0");
    check_field_offset(lv, ff, ABISELECT(28,16), "G31x7y0.ff");
    test_class_info(&lv, &cd_G31x7y0);
    dp->~G31x7y0();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y0(Test_G31x7y0, "G31x7y0", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x7y0C1Ev();
extern void _ZN7G31x7y0D1Ev();
Name_Map name_map_G31x7y0[] = {
  NSPAIR(_ZN7G31x7y0C1Ev),
  NSPAIR(_ZN7G31x7y0D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x7y0[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    15, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,20), //bcp->offset
    9, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(16,8), //bcp->offset
    6, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y0[];
extern void _ZN2F13fooEv();
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x7y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y0[0]),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x7y0[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x7y0[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G31x7y0[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x7y0[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y0[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y0[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y0[] = {
  ABISELECT(-32,-16),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y0[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y0[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y0[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y0[] = {
  {&(_ZTV7G31x7y0[6]),  6,23},
  {&(_tg__ZTV5E31x7__7G31x7y0[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y0[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y0[3]),  3,4},
  {&(_ZTV7G31x7y0[14]),  14,23},
  {&(_ZTV7G31x7y0[18]),  18,23},
  {&(_ZTV7G31x7y0[22]),  22,23},
  {&(_tg__ZTV3C31__7G31x7y0[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y0[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y0[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y0[];
extern  VTBL_ENTRY _ZTV7G31x7y0[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y0[];
static VTBL_ENTRY alt_thunk_names252[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y0 = {  "G31x7y0", // class name
  bases_G31x7y0, 6,
  &(vtc_G31x7y0[0]), // expected_vtbl_contents
  &(vtt_G31x7y0[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x7y0),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y0),23, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y0),11, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names252,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y1  : virtual E31x7 , F1 {
  int ff;
  ~G31x7y1(); // tgen
  G31x7y1(); // tgen
};
//SIG(1 G31x7y1) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ v2 Fi} Fi}


G31x7y1 ::~G31x7y1(){ note_dtor("G31x7y1", this);} // tgen
G31x7y1 ::G31x7y1(){ note_ctor("G31x7y1", this);} // tgen

static void Test_G31x7y1()
{
  extern Class_Descriptor cd_G31x7y1;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x7y1, buf);
    G31x7y1 *dp, &lv = *(dp=new (buf) G31x7y1());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x7y1)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y1)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x7y1");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x7y1");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(32,20), "G31x7y1");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(76,44), "G31x7y1");
    check_base_class_offset(lv, (E31x7*), ABISELECT(16,12), "G31x7y1");
    check_base_class_offset(lv, (F1*), 0, "G31x7y1");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x7y1.ff");
    test_class_info(&lv, &cd_G31x7y1);
    dp->~G31x7y1();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y1(Test_G31x7y1, "G31x7y1", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x7y1C1Ev();
extern void _ZN7G31x7y1D1Ev();
Name_Map name_map_G31x7y1[] = {
  NSPAIR(_ZN7G31x7y1C1Ev),
  NSPAIR(_ZN7G31x7y1D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x7y1[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    24, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,20), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    ABISELECT(16,12), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y1[];
extern void _ZN2F13fooEv();
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x7y1[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y1[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x7y1[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x7y1[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G31x7y1[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x7y1[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y1[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y1[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y1[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y1[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y1[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y1[] = {
  {&(_ZTV7G31x7y1[7]),  7,28},
  {&(_ZTV7G31x7y1[14]),  14,28},
  {&(_ZTV7G31x7y1[19]),  19,28},
  {&(_ZTV7G31x7y1[23]),  23,28},
  {&(_ZTV7G31x7y1[27]),  27,28},
  {&(_tg__ZTV5E31x7__7G31x7y1[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y1[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y1[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x7y1[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y1[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y1[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y1[];
extern  VTBL_ENTRY _ZTV7G31x7y1[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y1[];
static VTBL_ENTRY alt_thunk_names253[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y1 = {  "G31x7y1", // class name
  bases_G31x7y1, 6,
  &(vtc_G31x7y1[0]), // expected_vtbl_contents
  &(vtt_G31x7y1[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x7y1),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y1),28, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y1),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names253,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y2  : E31x7 , virtual F1 {
  int ff;
  ~G31x7y2(); // tgen
  G31x7y2(); // tgen
};
//SIG(1 G31x7y2) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x7y2 ::~G31x7y2(){ note_dtor("G31x7y2", this);} // tgen
G31x7y2 ::G31x7y2(){ note_ctor("G31x7y2", this);} // tgen

static void Test_G31x7y2()
{
  extern Class_Descriptor cd_G31x7y2;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x7y2, buf);
    G31x7y2 *dp, &lv = *(dp=new (buf) G31x7y2());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x7y2)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y2)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,20), "G31x7y2");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,28), "G31x7y2");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(16,12), "G31x7y2");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(60,36), "G31x7y2");
    check_base_class_offset(lv, (E31x7*), 0, "G31x7y2");
    check_base_class_offset(lv, (F1*), ABISELECT(64,40), "G31x7y2");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x7y2.ff");
    test_class_info(&lv, &cd_G31x7y2);
    dp->~G31x7y2();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y2(Test_G31x7y2, "G31x7y2", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x7y2C1Ev();
extern void _ZN7G31x7y2D1Ev();
Name_Map name_map_G31x7y2[] = {
  NSPAIR(_ZN7G31x7y2C1Ev),
  NSPAIR(_ZN7G31x7y2D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x7y2[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F1,    ABISELECT(64,40), //bcp->offset
    21, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    9, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y2[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x7y2[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y2[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x7y2[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x7y2[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-64,-40),
  (VTBL_ENTRY)&(_ZTI7G31x7y2[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x7y2[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y2[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y2[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y2[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y2[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y2[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y2[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y2[] = {
  {&(_ZTV7G31x7y2[7]),  7,25},
  {&(_tg__ZTV5E31x7__7G31x7y2[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y2[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y2[3]),  3,4},
  {&(_ZTV7G31x7y2[12]),  12,25},
  {&(_ZTV7G31x7y2[16]),  16,25},
  {&(_ZTV7G31x7y2[20]),  20,25},
  {&(_ZTV7G31x7y2[24]),  24,25},
  {&(_tg__ZTV3C31__7G31x7y2[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y2[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y2[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y2[];
extern  VTBL_ENTRY _ZTV7G31x7y2[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y2[];
static VTBL_ENTRY alt_thunk_names254[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y2 = {  "G31x7y2", // class name
  bases_G31x7y2, 6,
  &(vtc_G31x7y2[0]), // expected_vtbl_contents
  &(vtt_G31x7y2[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x7y2),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y2),25, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y2),12, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names254,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y3  : virtual E31x7 , virtual F1 {
  int ff;
  ~G31x7y3(); // tgen
  G31x7y3(); // tgen
};
//SIG(1 G31x7y3) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ v2 Fi} Fi}


G31x7y3 ::~G31x7y3(){ note_dtor("G31x7y3", this);} // tgen
G31x7y3 ::G31x7y3(){ note_ctor("G31x7y3", this);} // tgen

static void Test_G31x7y3()
{
  extern Class_Descriptor cd_G31x7y3;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(13,14)];
    init_test(&cd_G31x7y3, buf);
    G31x7y3 *dp, &lv = *(dp=new (buf) G31x7y3());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(96,52), "sizeof(G31x7y3)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y3)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,24), "G31x7y3");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,32), "G31x7y3");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(32,16), "G31x7y3");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(76,40), "G31x7y3");
    check_base_class_offset(lv, (E31x7*), ABISELECT(16,8), "G31x7y3");
    check_base_class_offset(lv, (F1*), ABISELECT(80,44), "G31x7y3");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x7y3.ff");
    test_class_info(&lv, &cd_G31x7y3);
    dp->~G31x7y3();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y3(Test_G31x7y3, "G31x7y3", ABISELECT(96,52));

#else // __cplusplus

extern void _ZN7G31x7y3C1Ev();
extern void _ZN7G31x7y3D1Ev();
Name_Map name_map_G31x7y3[] = {
  NSPAIR(_ZN7G31x7y3C1Ev),
  NSPAIR(_ZN7G31x7y3D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F1;
extern VTBL_ENTRY _ZTI2F1[];
extern  VTBL_ENTRY _ZTV2F1[];
static Base_Class bases_G31x7y3[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,32), //bcp->offset
    24, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    11, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    7, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F1,    ABISELECT(80,44), //bcp->offset
    28, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    5, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y3[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
extern void _ZN2F13fooEv();
static  VTBL_ENTRY vtc_G31x7y3[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y3[0]),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x7y3[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G31x7y3[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G31x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI7G31x7y3[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  0,
  ABISELECT(-80,-44),
  (VTBL_ENTRY)&(_ZTI7G31x7y3[0]),
  (VTBL_ENTRY)&_ZN2F13fooEv,
};
extern VTBL_ENTRY _ZTV7G31x7y3[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y3[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y3[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y3[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y3[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y3[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y3[] = {
  {&(_ZTV7G31x7y3[8]),  8,32},
  {&(_ZTV7G31x7y3[14]),  14,32},
  {&(_ZTV7G31x7y3[19]),  19,32},
  {&(_ZTV7G31x7y3[23]),  23,32},
  {&(_ZTV7G31x7y3[27]),  27,32},
  {&(_ZTV7G31x7y3[31]),  31,32},
  {&(_tg__ZTV5E31x7__7G31x7y3[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y3[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y3[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x7y3[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y3[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y3[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y3[];
extern  VTBL_ENTRY _ZTV7G31x7y3[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y3[];
static VTBL_ENTRY alt_thunk_names255[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y3 = {  "G31x7y3", // class name
  bases_G31x7y3, 6,
  &(vtc_G31x7y3[0]), // expected_vtbl_contents
  &(vtt_G31x7y3[0]), // expected_vtt_contents
  ABISELECT(96,52), // object size
  NSPAIRA(_ZTI7G31x7y3),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y3),32, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y3),13, //virtual table table var
  5, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names255,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y4  : E31x7 , F0 {
  int ff;
  ~G31x7y4(); // tgen
  G31x7y4(); // tgen
};
//SIG(1 G31x7y4) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G31x7y4 ::~G31x7y4(){ note_dtor("G31x7y4", this);} // tgen
G31x7y4 ::G31x7y4(){ note_ctor("G31x7y4", this);} // tgen

static void Test_G31x7y4()
{
  extern Class_Descriptor cd_G31x7y4;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x7y4, buf);
    G31x7y4 *dp, &lv = *(dp=new (buf) G31x7y4());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x7y4)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y4)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(40,24), "G31x7y4");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(56,32), "G31x7y4");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(24,16), "G31x7y4");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(68,40), "G31x7y4");
    check_base_class_offset(lv, (E31x7*), 0, "G31x7y4");
    check_base_class_offset(lv, (F0*), ABISELECT(12,8), "G31x7y4");
    check_field_offset(lv, ff, ABISELECT(16,12), "G31x7y4.ff");
    test_class_info(&lv, &cd_G31x7y4);
    dp->~G31x7y4();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y4(Test_G31x7y4, "G31x7y4", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x7y4C1Ev();
extern void _ZN7G31x7y4D1Ev();
Name_Map name_map_G31x7y4[] = {
  NSPAIR(_ZN7G31x7y4C1Ev),
  NSPAIR(_ZN7G31x7y4D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x7y4[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(40,24), //bcp->offset
    12, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(56,32), //bcp->offset
    16, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(24,16), //bcp->offset
    6, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(68,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(12,8), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y4[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x7y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y4[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI7G31x7y4[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI7G31x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI7G31x7y4[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x7y4[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y4[] = {
  ABISELECT(68,40),
  ABISELECT(56,32),
  ABISELECT(40,24),
  ABISELECT(24,16),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y4[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-24,-16),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-40,-24),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y4[] = {
  ABISELECT(-32,-16),
  ABISELECT(-56,-32),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y4[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y4[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y4[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y4[] = {
  {&(_ZTV7G31x7y4[6]),  6,20},
  {&(_tg__ZTV5E31x7__7G31x7y4[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y4[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y4[3]),  3,4},
  {&(_ZTV7G31x7y4[11]),  11,20},
  {&(_ZTV7G31x7y4[15]),  15,20},
  {&(_ZTV7G31x7y4[19]),  19,20},
  {&(_tg__ZTV3C31__7G31x7y4[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y4[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y4[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y4[];
extern  VTBL_ENTRY _ZTV7G31x7y4[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y4[];
static VTBL_ENTRY alt_thunk_names256[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y4 = {  "G31x7y4", // class name
  bases_G31x7y4, 6,
  &(vtc_G31x7y4[0]), // expected_vtbl_contents
  &(vtt_G31x7y4[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x7y4),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y4),20, //virtual function table var
  6, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y4),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names256,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y5  : virtual E31x7 , F0 {
  int ff;
  ~G31x7y5(); // tgen
  G31x7y5(); // tgen
};
//SIG(1 G31x7y5) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} BC7{ Fi} Fi}


G31x7y5 ::~G31x7y5(){ note_dtor("G31x7y5", this);} // tgen
G31x7y5 ::G31x7y5(){ note_ctor("G31x7y5", this);} // tgen

static void Test_G31x7y5()
{
  extern Class_Descriptor cd_G31x7y5;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(11,13)];
    init_test(&cd_G31x7y5, buf);
    G31x7y5 *dp, &lv = *(dp=new (buf) G31x7y5());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(80,48), "sizeof(G31x7y5)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y5)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,28), "G31x7y5");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,36), "G31x7y5");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(32,20), "G31x7y5");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(76,44), "G31x7y5");
    check_base_class_offset(lv, (E31x7*), ABISELECT(16,12), "G31x7y5");
    check_base_class_offset(lv, (F0*), ABISELECT(8,4), "G31x7y5");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x7y5.ff");
    test_class_info(&lv, &cd_G31x7y5);
    dp->~G31x7y5();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y5(Test_G31x7y5, "G31x7y5", ABISELECT(80,48));

#else // __cplusplus

extern void _ZN7G31x7y5C1Ev();
extern void _ZN7G31x7y5D1Ev();
Name_Map name_map_G31x7y5[] = {
  NSPAIR(_ZN7G31x7y5C1Ev),
  NSPAIR(_ZN7G31x7y5D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x7y5[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,28), //bcp->offset
    19, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,36), //bcp->offset
    23, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(8,4), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 0},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y5[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x7y5[] = {
  ABISELECT(76,44),
  ABISELECT(64,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y5[0]),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x7y5[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x7y5[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-36),
  (VTBL_ENTRY)&(_ZTI7G31x7y5[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x7y5[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y5[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y5[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y5[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y5[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y5[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y5[] = {
  {&(_ZTV7G31x7y5[7]),  7,27},
  {&(_ZTV7G31x7y5[13]),  13,27},
  {&(_ZTV7G31x7y5[18]),  18,27},
  {&(_ZTV7G31x7y5[22]),  22,27},
  {&(_ZTV7G31x7y5[26]),  26,27},
  {&(_tg__ZTV5E31x7__7G31x7y5[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y5[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y5[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x7y5[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y5[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y5[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y5[];
extern  VTBL_ENTRY _ZTV7G31x7y5[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y5[];
static VTBL_ENTRY alt_thunk_names257[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y5 = {  "G31x7y5", // class name
  bases_G31x7y5, 6,
  &(vtc_G31x7y5[0]), // expected_vtbl_contents
  &(vtt_G31x7y5[0]), // expected_vtt_contents
  ABISELECT(80,48), // object size
  NSPAIRA(_ZTI7G31x7y5),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y5),27, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y5),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names257,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y6  : E31x7 , virtual F0 {
  int ff;
  ~G31x7y6(); // tgen
  G31x7y6(); // tgen
};
//SIG(1 G31x7y6) C1{ BC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x7y6 ::~G31x7y6(){ note_dtor("G31x7y6", this);} // tgen
G31x7y6 ::G31x7y6(){ note_ctor("G31x7y6", this);} // tgen

static void Test_G31x7y6()
{
  extern Class_Descriptor cd_G31x7y6;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(10,12)];
    init_test(&cd_G31x7y6, buf);
    G31x7y6 *dp, &lv = *(dp=new (buf) G31x7y6());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(72,44), "sizeof(G31x7y6)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y6)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(32,20), "G31x7y6");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(48,28), "G31x7y6");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(16,12), "G31x7y6");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(60,36), "G31x7y6");
    check_base_class_offset(lv, (E31x7*), 0, "G31x7y6");
    check_base_class_offset(lv, (F0*), ABISELECT(64,40), "G31x7y6");
    check_field_offset(lv, ff, ABISELECT(12,8), "G31x7y6.ff");
    test_class_info(&lv, &cd_G31x7y6);
    dp->~G31x7y6();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y6(Test_G31x7y6, "G31x7y6", ABISELECT(72,44));

#else // __cplusplus

extern void _ZN7G31x7y6C1Ev();
extern void _ZN7G31x7y6D1Ev();
Name_Map name_map_G31x7y6[] = {
  NSPAIR(_ZN7G31x7y6C1Ev),
  NSPAIR(_ZN7G31x7y6D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x7y6[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(32,20), //bcp->offset
    13, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    7, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(48,28), //bcp->offset
    17, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    8, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(16,12), //bcp->offset
    7, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    6, //bcp->index_in_construction_vtbl_array
    9, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(60,36), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    0, //bcp->offset
    -1, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    2, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 0},
  {&cd_F0,    ABISELECT(64,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y6[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x7y6[] = {
  ABISELECT(64,40),
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y6[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI7G31x7y6[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI7G31x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI7G31x7y6[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x7y6[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y6[] = {
  ABISELECT(60,36),
  ABISELECT(48,28),
  ABISELECT(32,20),
  ABISELECT(16,12),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y6[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-12),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-20),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y6[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-28),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y6[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y6[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y6[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y6[] = {
  {&(_ZTV7G31x7y6[7]),  7,21},
  {&(_tg__ZTV5E31x7__7G31x7y6[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y6[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y6[3]),  3,4},
  {&(_ZTV7G31x7y6[12]),  12,21},
  {&(_ZTV7G31x7y6[16]),  16,21},
  {&(_ZTV7G31x7y6[20]),  20,21},
  {&(_tg__ZTV3C31__7G31x7y6[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y6[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y6[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y6[];
extern  VTBL_ENTRY _ZTV7G31x7y6[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y6[];
static VTBL_ENTRY alt_thunk_names258[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y6 = {  "G31x7y6", // class name
  bases_G31x7y6, 6,
  &(vtc_G31x7y6[0]), // expected_vtbl_contents
  &(vtt_G31x7y6[0]), // expected_vtt_contents
  ABISELECT(72,44), // object size
  NSPAIRA(_ZTI7G31x7y6),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y6),21, //virtual function table var
  7, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y6),11, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names258,
};
#endif // __cplusplus

//============================================================================

#ifdef __cplusplus

struct  G31x7y7  : virtual E31x7 , virtual F0 {
  int ff;
  ~G31x7y7(); // tgen
  G31x7y7(); // tgen
};
//SIG(1 G31x7y7) C1{ VBC2{ VBC3{ VBC4{ v1 Fi} VBC5{ v1 Fi} v1 Fi} VBC6{ Fi} Fi} VBC7{ Fi} Fi}


G31x7y7 ::~G31x7y7(){ note_dtor("G31x7y7", this);} // tgen
G31x7y7 ::G31x7y7(){ note_ctor("G31x7y7", this);} // tgen

static void Test_G31x7y7()
{
  extern Class_Descriptor cd_G31x7y7;
  void *lvp;
  {
    ABISELECT(double,int) buf[ABISELECT(12,13)];
    init_test(&cd_G31x7y7, buf);
    G31x7y7 *dp, &lv = *(dp=new (buf) G31x7y7());
    lvp = (void*)&lv;
    check2(sizeof(lv), ABISELECT(88,48), "sizeof(G31x7y7)");
    check2(__alignof__(lv), ABISELECT(8,4), "__alignof__(G31x7y7)");
    check_base_class_offset(lv, (A1*)(C31*), ABISELECT(48,24), "G31x7y7");
    check_base_class_offset(lv, (B1*)(C31*), ABISELECT(64,32), "G31x7y7");
    check_base_class_offset(lv, (C31*)(E31x7*), ABISELECT(32,16), "G31x7y7");
    check_base_class_offset(lv, (D0*)(E31x7*), ABISELECT(76,40), "G31x7y7");
    check_base_class_offset(lv, (E31x7*), ABISELECT(16,8), "G31x7y7");
    check_base_class_offset(lv, (F0*), ABISELECT(80,44), "G31x7y7");
    check_field_offset(lv, ff, ABISELECT(8,4), "G31x7y7.ff");
    test_class_info(&lv, &cd_G31x7y7);
    dp->~G31x7y7();
  }
  Check_Ctor_Dtor_Calls(lvp);
}
static Arrange_To_Call_Me vG31x7y7(Test_G31x7y7, "G31x7y7", ABISELECT(88,48));

#else // __cplusplus

extern void _ZN7G31x7y7C1Ev();
extern void _ZN7G31x7y7D1Ev();
Name_Map name_map_G31x7y7[] = {
  NSPAIR(_ZN7G31x7y7C1Ev),
  NSPAIR(_ZN7G31x7y7D1Ev),
  {0,0}
};
extern Class_Descriptor cd_A1;
extern VTBL_ENTRY _ZTI2A1[];
extern  VTBL_ENTRY _ZTV2A1[];
extern Class_Descriptor cd_B1;
extern VTBL_ENTRY _ZTI2B1[];
extern  VTBL_ENTRY _ZTV2B1[];
extern Class_Descriptor cd_C31;
extern VTBL_ENTRY _ZTI3C31[];
extern  VTBL_ENTRY _ZTV3C31[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT3C31[];
extern Class_Descriptor cd_D0;
extern VTBL_ENTRY _ZTI2D0[];
extern Class_Descriptor cd_E31x7;
extern VTBL_ENTRY _ZTI5E31x7[];
extern  VTBL_ENTRY _ZTV5E31x7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT5E31x7[];
extern Class_Descriptor cd_F0;
extern VTBL_ENTRY _ZTI2F0[];
static Base_Class bases_G31x7y7[] = {
  // ofst, vfto, nneg, vtt_idx, base_vtt_idx, init_seq, direct, virtual
  {&cd_A1,    ABISELECT(48,24), //bcp->offset
    20, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    4, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    1, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_B1,    ABISELECT(64,32), //bcp->offset
    24, //bcp->virtual_function_table_offset
    3, //num_negative_vtable_entries(t, bcp)
    5, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    2, //init_seq
    2, //immediately_derived
  0, 1},
  {&cd_C31,    ABISELECT(32,16), //bcp->offset
    14, //bcp->virtual_function_table_offset
    5, //num_negative_vtable_entries(t, bcp)
    3, //bcp->index_in_construction_vtbl_array
    10, //bcp->base_subarray_index_in_construction_vtbl_array
    3, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_D0,    ABISELECT(76,40), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    4, //immediately_derived
  0, 1},
  {&cd_E31x7,    ABISELECT(16,8), //bcp->offset
    8, //bcp->virtual_function_table_offset
    6, //num_negative_vtable_entries(t, bcp)
    2, //bcp->index_in_construction_vtbl_array
    6, //bcp->base_subarray_index_in_construction_vtbl_array
    4, //init_seq
    -1, //immediately_derived
  1, 1},
  {&cd_F0,    ABISELECT(80,44), //bcp->offset
    -1, //bcp->virtual_function_table_offset
    2, //num_negative_vtable_entries(t, bcp)
    0, //bcp->index_in_construction_vtbl_array
    0, //bcp->base_subarray_index_in_construction_vtbl_array
    -1, //init_seq
    -1, //immediately_derived
  1, 1},
  {0}};
extern VTBL_ENTRY _ZTI7G31x7y7[];
extern void _ZN3C313fooEv();
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY vtc_G31x7y7[] = {
  ABISELECT(80,44),
  ABISELECT(76,40),
  ABISELECT(64,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI7G31x7y7[0]),
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI7G31x7y7[0]),
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI7G31x7y7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
  ABISELECT(-16,-8),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI7G31x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
  ABISELECT(-32,-16),
  ABISELECT(-64,-32),
  (VTBL_ENTRY)&(_ZTI7G31x7y7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern VTBL_ENTRY _ZTV7G31x7y7[];
static  VTBL_ENTRY _tg__ZTV5E31x7__7G31x7y7[] = {
  ABISELECT(60,32),
  ABISELECT(48,24),
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__5E31x7__7G31x7y7[] = {
  0,
  ABISELECT(32,16),
  ABISELECT(16,8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__5E31x7__7G31x7y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__5E31x7__7G31x7y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-48,-24),
  (VTBL_ENTRY)&(_ZTI5E31x7[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void _ZN3C313fooEv();
static  VTBL_ENTRY _tg__ZTV3C31__7G31x7y7[] = {
  ABISELECT(32,16),
  ABISELECT(16,8),
  0,
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&_ZN3C313fooEv,
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2A1__3C31__7G31x7y7[] = {
  ABISELECT(-16,-8),
  ABISELECT(-16,-8),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
extern void ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv)();
extern void ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv)() __attribute__((weak));
static  VTBL_ENTRY _tg__ZTV2B1__3C31__7G31x7y7[] = {
  ABISELECT(-32,-16),
  ABISELECT(-32,-16),
  (VTBL_ENTRY)&(_ZTI3C31[0]),
  (VTBL_ENTRY)&ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv),
};
static  VTT_ENTRY vtt_G31x7y7[] = {
  {&(_ZTV7G31x7y7[8]),  8,28},
  {&(_ZTV7G31x7y7[14]),  14,28},
  {&(_ZTV7G31x7y7[19]),  19,28},
  {&(_ZTV7G31x7y7[23]),  23,28},
  {&(_ZTV7G31x7y7[27]),  27,28},
  {&(_tg__ZTV5E31x7__7G31x7y7[6]),  6,6},
  {&(_tg__ZTV3C31__5E31x7__7G31x7y7[5]),  5,6},
  {&(_tg__ZTV2A1__5E31x7__7G31x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__5E31x7__7G31x7y7[3]),  3,4},
  {&(_tg__ZTV3C31__7G31x7y7[4]),  4,5},
  {&(_tg__ZTV2A1__3C31__7G31x7y7[3]),  3,4},
  {&(_tg__ZTV2B1__3C31__7G31x7y7[3]),  3,4},
};
extern VTBL_ENTRY _ZTI7G31x7y7[];
extern  VTBL_ENTRY _ZTV7G31x7y7[];
extern  VTBL_ENTRY * __attribute__((weak))_ZTT7G31x7y7[];
static VTBL_ENTRY alt_thunk_names259[] = {
  (VTBL_ENTRY)ABISELECT(_ZTv0_n24_N3C313fooEv,_ZTv0_n12_N3C313fooEv), // 
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn32_N3C313fooEv,_ZThn16_N3C313fooEv),
  (VTBL_ENTRY)ABISELECT(_ZThn16_N3C313fooEv,_ZThn8_N3C313fooEv),
  ALT_NAMES_TERMINATOR,
ALT_NAMES_TERMINATOR};
Class_Descriptor cd_G31x7y7 = {  "G31x7y7", // class name
  bases_G31x7y7, 6,
  &(vtc_G31x7y7[0]), // expected_vtbl_contents
  &(vtt_G31x7y7[0]), // expected_vtt_contents
  ABISELECT(88,48), // object size
  NSPAIRA(_ZTI7G31x7y7),ABISELECT(56,32), //typeinfo_var
  NSPAIRA(_ZTV7G31x7y7),28, //virtual function table var
  8, // offset into main vftv pointed to by object[0]
  NSPAIRA(_ZTT7G31x7y7),12, //virtual table table var
  4, // n_initialized_bases
  1, // has_virtual_bases
  0, // has_class_type_fields
  alt_thunk_names259,
};
#endif // __cplusplus

//============================================================================

